synchronized关键字
synchronized
方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前。一次只能有一个线程进入该方法,其他线程想要调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入。
public synchronized void func(){
// TODO
}
对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块。
public void func(){
synchronized(a1) {
//一次只能有一个线程进入
}
}
synchronized后面括号里是一对象,此时,线程获得的是对象锁。但直接对变量上锁是非常粗糙的行为,最好使用虚拟锁替代。
MyMemberClass x, y;
Object xlock = new Object(), ylock = new Object();
public void foo() {
synchronized(xlock) {
//access x here
}
//do something here - but don't use shared resources
synchronized(ylock) {
//access y here
}
}
public void bar() {
synchronized(this) {
//access both x and y here
}
//do something here - but don't use shared resources
}
synchronized后面括号的对象为类,此时加锁的为此类,其他线程所有对类进行的操作皆不可行,包括静态变量和静态方法。
synchronized(ArrayWithLockOrder.class) {
//TODO
}