众所周知,synchronized可修饰方法和代码块,可作用于类或者对象。
当修饰代码块时,synchronized(object) 作用于对象,只约束该对象。
synchronized(class)作用于类,约束类所有的对象。
修饰方法时,synchronized 修饰static方法时,作用于类。修饰非static方法时作用于对象。
注意类锁和对象锁是两个不同的锁,二者不会发生同步关系。
由于static变量,可被static方法调用,也可被非static方法调用,当二者同时被synchronized修饰时,所以就会出现潜在的同步问题。
所以多线程时静态变量尽量只用静态方法调用,不然就会出现同步混乱。
class Test implements Runnable{
public static int num = 0;
public synchronized void changeNum(){
num++;
System.out.println(num);
}
public synchronized static void addNum(){
num++;
System.out.println(num);
}
@Override
public void run() {
for (int i = 0; i < 2000; i++) {
changeNum();
addNum();
try {
Thread.sleep(5);
}catch (InterruptedException ie){
}
}
}
public static void main(String[] args) {
Test test = new Test();
Thread t1 = new Thread(test);
Thread t2 = new Thread(test);
t1.start();
t2.start();
}
}
如果同步,结果应该是8000,然而并不是。