众所周知,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,然而并不是。
时间: 2024-12-25 06:42:36