Synchronized介绍
Posted wansw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、5种情况)
- 每个实例都对应有自己的一把锁,不同实例之前互不影响;
例外:锁对象是*.class以及synchronized修饰的是static方法的时候,所有对象共用同一把类锁(对应2、3、4、6种情况) - 无论是方法正常执行完毕或者方法抛出异常,都会释放锁(对应第7种情况)
性质
1、可重入:
? 同一个线程的外层函数获取锁后,内层函数可以直接再次获取该锁。
? 避免死锁、提升封装性
2、不可中断
原理
1、加锁和释放锁的原理:现象、时机、字节码
2、可重入原理:加锁次数计数器
3、可见性原理:内存模型
缺点
1、效率低
- 锁的释放情况少
- 视图获取锁时不能设置超时时间
- 不能中断一个正在视图获取锁的线程
2、灵活度较差
- 加锁和释放锁的时机单一
- 每个锁仅有单一的对象
3、无法知道是否成功获取到锁
注意点
1、锁对象不能为空、作用域不宜过大、避免死锁
2、尽量使用JUC包下的类,再考虑Synchronized,再考虑Lock
以上是关于Synchronized介绍的主要内容,如果未能解决你的问题,请参考以下文章