本文共 1279 字,大约阅读时间需要 4 分钟。
如下代码是两个静态同步方法
Class A{public static synchronized void write(boolean b){ isTrue = b;}public static synchronized boolean read(){ return isTrue;}}
那么我们来问几个问题
如下代码是两个实例同步方法
public synchronized void write(boolean b){ isTrue = b;}public synchronized boolean read(){ return isTrue;}
同样问两个问题:
回答问题之前,先想一下当前方法使用的锁是哪一个?当前线程是否有拿到这把锁?拿到锁了就能访问当前方法了。
我们先回顾基础知识,Java中的每一个对象都可以作为锁,而不同的场景锁是不一样的。
线程1访问A.write()方法时,线程2能访问A.read()方法吗?不能,因为静态方法的锁都是A.Class对象,线程1拿到锁之后,线程2就拿不到锁了。
线程1访问new A().write()方法时,线程2能访问new A().read()方法吗?不能,原因同上。
线程1访问A.write()方法时,线程2能访问new A().read()方法吗?不能,原因同上
A a=new A(); 线程1访问a.write()方法,线程2能访问a.read()方法吗?不能,因为这两个方法的锁都是对象a,线程1拿到了锁,线程2就不能访问了。
A a=new A(); A b=new A();线程1访问a.write()方法,线程2能访问b.read()方法吗?可以,因为线程1拿到的是锁是 a,而线程2访问b.read()需要的是锁是b。
现在你应该明白了这句话,对于实例同步方法,锁是当前实例对象。对于静态同步方法,锁是当前对象的Class对象。
文章转自
转载地址:http://vhtla.baihongyu.com/