Synchronized关键字解读

一句话解释:

JVM会自动通过monitor来加锁和解锁,保证了同时只有一个线程能够执行指定的代码,从而保证了线程安全,同时具有可重入和不可中断的性质。

用法:

synchronize两种用法:

对象锁和类锁

对象锁分为代码块形式和方法锁形式

#方法锁
public synchronize void method(){
    ...
}


#代码块锁
public void method(){
    synchronize(this){
         ...
    } 
}

类锁,效果是全局锁定,因为jvm中只有一个这个类class,但可以有多个实例(new对象)

#形式1, 加在static方法上
public static synchronize void method(){
    ...
}

#形式2, 使用.class 形式
public void method(){
    synchronize(object.class){
        ...
    }
}

同步方法7中情况:

  1. 两个线程访问的是一个对象的同一个同步方法                      顺序执行,串行  正常运作,会同步
  2. 两个线程访问的是两个实例的同一个方法                             相互不影响
  3. 两个线程访问的是synchronized的静态方法                          相互影响串行,类锁情况 
  4. 同时访问同步方法与非同步方法                                            不相互影响  非同步方法不受影响
  5. 访问同一个对象的不同的普通同步方法                                拿到的锁时同一把锁,同一个实例,所以受到影响,不能同时运行
  6. 同时访问静态synchronized和非静态synchronized方法        背后的锁对象不是同一个,所以可以并行执行
  7. 方法抛出异常后,会释放锁                                                  正确,抛出异常后,会自动释放锁

 

性质:

可重入性。好处:避免死锁,提高封装性;粒度,是线程而不是调用

不可中断

 

原理:

加锁和解锁的原理:现象、时机、深入JVM字节码

可重入行原理:加锁次数计数器

  • JVM负责跟踪对象被加锁次数(moniterenter  monitorexit)
  • 线程第一次给对象加锁的时候,计数器+1,每当这个相同的线程在此对象上再次获得锁,计数器会递增。
  • 每次任务离开,计数器递减,当计数器为0时,锁完全释放

保证可行性原理:内存模型。线程的有本地内存,线程间通过逐内存进行通信

 

 

缺陷:

效率低

  1. 锁的释放时机情况少
  2. 试图获得锁时,不能设置超时时间
  3. 不能中断一个正在试图获取锁的线程

不够灵活

  1. 加解锁时机单一
  2. 每个锁仅有单一的条件,可能不够

不知道是否已经成功获取到锁

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kylin5221

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值