这是我参与8月更文挑战的第18天
一、简介
synchronized一句话来解释其作用就是:能够保证同一时刻最多只有一个线程执行该段代码,以达到并发安全的效果。也就是说Synchronized就好比是一把锁,某个线程把资源锁住了之后,别人就不能使用了,只有当这个线程用完了别人才能用。
本文探寻synchronized最基础用法及性质
二、分类
根据synchronized用法分类如下图所示,对不同对象进行加锁,效果也不一样。
其中值得注意的类锁和对象锁主要区别在于对不同对象实例的限制。类锁会阻塞不同对象、对象实例的进程(即按照顺序进入类,执行方法,结束)。而对象锁只对当前实例对象有效,对不同对象实例则不生效。比方有两个对象实例,同时去执行某个同步方法块,则不会阻塞。
三、synchronized性质
(一)、可重入性质
指的是同一线程的外层函数获得锁之后,内层函数可以直接再次获取该锁。一个线程拥有了锁仍然还可以重复申请锁。
(1)同一个方法中是不是可重入的。就好比是递归调用同步方法。 -- 可重入
(2)不同的方法是不是可重入的。就好比是一个同步方法调用另外一个同步方法。--可重入
(3)不同的类方法是不是可重入的。--可重入
(二)、不可中断性质
一旦锁被其他线程抢占,必须等待。等别的线程释放了锁,才可以拿到。否则需要一直等下去。
四、synchronized缺点
(1)效率低 synchronized不可中断,如果一个等待的线程不能获取到锁将会一直等待,不能做其他的事。
(2)不够灵活 加锁和解锁的时候,每个锁只能有一个对象处理,这对于目前分布式等思想格格不入。
(3)无法知道是否成功获取到锁 也就是我们的锁如果获取到了,我们无法得知。既然无法得知我们也就很不容易进行改进。