多把锁 为了提高并发度我们可以提供多把锁,假设有一个共享资源room对象,很多线程会去访问,一部分线程只访问其中a资源,另一部分线程只访问b的资源,此时如果所有线程把锁加在room对象上面虽然可以保证线程安全,但是并发度不高。 class Room{ Object a= new Object(); Object b= new Object(); } 此时可以使用两把锁,不要把锁加在room对象,而是分别加在a和b对象,这样第一类线程只需要申请a的锁,第二类线程只需要申请b的锁,锁的粒度变小了,两类线程之间就没有竞争关系了从而提高了并发度。 死锁问题 引入多把锁会容易产生死锁问题,如上例子,现实中会有很多线程既需要访问资源a也需要访问资源b。 如果线程1获取了对象a的锁,正在等待获取对象b的锁,同时线程c获取了对象b的锁,正等待获取对象a的锁,此时两个线程就会陷入死等状态。如下代码所示 public class Test { static Object a = new Object(); static Object b = new Object(); public static Logger log = LoggerFactory.getLogger(Test.class); public static void main(String[] args) throws InterruptedException { new Thread(()->{ synchronized (a){ log.info("线程t1已经获取a的锁"); sleep(1000); log.info("线程t1等待获取b的锁"); synchronized (b){ } } },"t1").start(); new Thread(()->{ synchronized (b){ log.info("线程t2已经获取b的锁"); sleep(1000); log.info("线程t2等待获取a的锁"); synchronized (a){<