聊一聊synchronized 锁

一个对象里面如果有多个synchronized 方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法,其他线程都只能等待话句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法

锁的是当前对象this,被锁定后,其他线程都不能进入到当前对象的其他的synchronized方法

永远记住一个对象一把锁,多个线程操作同一个对象的实例变量或者实例方法,需要阻塞;不用对象不管

静态方法锁的是类,普通方法锁的是对象

只要在一个资源类里面,不管他有多少个同步方法,只要一个线程先访问了任何一个资源类里的任何一个同步方法,那么他锁的不是这一个方法,锁的是该方法所在的整个资源类,锁的是整个对象。

对象锁 ———— 同一时间段只允许有一个线程进到资源类里面访问其中的一个资源方法

普通方法和同步锁无关

两个对象,不是同一把锁,没瓜葛

synchronized 实现同步的基础:java中每一个对象都可以作为一把锁
对于普通同步方法,锁是当前实例对象,锁的是当前对象this
对于同步方法块,锁是synchronized括号里配置的对象
对于静态同步方法,锁是当前类的Class
锁的对象不冲突时,各自执行

静态变量可以直接使用类名来访问,无需创建类的对象
可以使用新建对象名来访问/修改静态变量

(1)一个对象里面如果有很多个synchronized方法,某一个时刻内,只要一个线程去调用其中一个synchronized方法了,其他线程就只能等待,换句话说,某一个时刻内,只能由唯一一个线程去访问这些synchronized方法

(1.1)锁锁的是当前对象this,被锁后,其他的线程都不能进入到当前对象的其他synchronized方法

(2)普通方法和同步锁无关

(3)换成两个对象后,不是同一把锁了,无瓜葛

(4)所有的非静态同步方法用的都是同一把锁————实例对象本身,synchronized实现同步的基础:java中每一个对象都可以作为一把锁。

  •  对于普通同步方法,锁的是当前实例对象
    
  •  对于同步方法块,锁的是synchronized括号里的配置对象
    
  •  对于静态同步方法,锁的是当前类Class对象
    

结论:1.当一个线程访问同步代码块的时候,他首先必须得到锁,退出或者抛异常时必须释放锁。也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须要等待获取所得方法释放锁后才能获取锁,可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的不是用的不是同一把锁,所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。

  2.所有的静态同步方法用的也是同一把锁————类class对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态关系的。非静————实例对象锁,静态————类本身。但是一旦一个静态同步方法获取锁后,其他静态同步方法都必须等待该方法释放锁后才能获取锁。而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只需要他们同一个类的实例对象

  3.锁的对象不冲突时,各自执行
原文地址:https://www.cnblogs.com/nineberg/p/13532505.html