java并发之synchronized

众所周知,synchronized功能:同步,保证内存可见性。

实现原理是靠每个对象都有的monitor锁。

可修饰方法和代码块,可作用于类或者对象。

当修饰代码块时,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,然而并不是。

原文地址:https://www.cnblogs.com/zqiguoshang/p/6891266.html