java 类锁与对象锁(实例锁)同步问题

Posted zqiguoshang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 类锁与对象锁(实例锁)同步问题相关的知识,希望对你有一定的参考价值。

众所周知,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,然而并不是。

 

以上是关于java 类锁与对象锁(实例锁)同步问题的主要内容,如果未能解决你的问题,请参考以下文章

类锁与对象锁,重入锁

java的同步方法和同步代码块,对象锁,类锁区别

java多线程进阶同步锁

synchronized关键字以及实例锁 类锁

ReentrantLock锁与内置锁synchronized

ReentrantLock锁与内置锁synchronized