Synchronized介绍

来源

https://www.imooc.com/learn/1086

作用

​ 同步方法支持一种简单的策略来防止线程干扰和内存一致性错误,如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。

​ 即:能够保证在同一时刻最多只有一个线程执行该段代码,达到保证并发安全的效果。

  • Synchronized是Java的关键字,被Java原生支持。

  • 是最基本的互斥同步手段。

用法

  • 对象锁
    • 方法锁(锁对象为this当前实例对象)
    • 同步代码锁(自己指定锁对象)
  • 类锁:只有一个Class对象
    • synchronized修饰静态方法
    • 指定锁为Class对象

多线程访问同步方法的7种情况

1、两个线程同时访问一个对象的同步方法

​ 串行执行

2、两个线程访问的是两个对象的同步方法

​ 并行方法,不是一个对象。

3、两个线程访问的是synchronized的静态方法

​ 串行执行,只有一个Class对象

4、同时访问同步方法和非同步方法

​ 串行执行

5、访问同一个对象的不同的普通同步方法

​ 串行,this是同一个

6、同时访问静态synchronized和非静态的synchronized方法

​ 并行执行,锁对象不是同一个

7、方法抛出异常后,释放锁

​ synchronized会自动释放,Lock等不会

三个核心思想

  1. 一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待(对应第1、5种情况)
  2. 每个实例都对应有自己的一把锁,不同实例之前互不影响;
    例外:锁对象是*.class以及synchronized修饰的是static方法的时候,所有对象共用同一把类锁(对应2、3、4、6种情况)
  3. 无论是方法正常执行完毕或者方法抛出异常,都会释放锁(对应第7种情况)

性质

1、可重入:

​ 同一个线程的外层函数获取锁后,内层函数可以直接再次获取该锁。

2、不可中断

原理

1、加锁和释放锁的原理:Monitor

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

3、可见性原理:内存模型图

缺点

1、效率低

  • 锁的释放情况少
  • 视图获取锁时不能设置超时时间
  • 不能中断一个正在视图获取锁的线程

2、灵活度较差

  • 加锁和释放锁的时机单一
  • 每个锁仅有单一的对象

3、无法知道是否成功获取到锁

注意点

1、锁对象不能为空、作用域不宜过大、避免死锁

2、尽量使用JUC包下的类,再考虑Synchronized,再考虑Lock

转载于:https://www.cnblogs.com/wansw/p/10218090.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值