-
1.使用读写锁 2.使用lock
查看全部 -
Synchronized的作用:
官方:同步方法支持一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。
一句话说出作用:能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。
Synchronized的两个用法:
对象锁:
包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)
类锁:
指synchronized修饰静态的方法或指定锁为Class对象
性质
可重入
什么是可重入:指的是同一线程的外层函数获得锁之后,内层函数可以直接再次获取该锁
好处:避免死锁、提升封装性
不可中断
一旦这个锁已经被别人获得了,如果我还想获得,我只能选择等待或者阻塞,直到别的线程释放这个锁。如果别人永远不释放锁,那么我只能永远地等下去。
原理
加锁和释放锁地原理:
获取和释放锁地时机:进入和推出同步代码块(包括抛出异常)
通过monitorenter和monitorexit指令
可重入原理:加锁次数计数器
JVM会记录被加锁的次数
保证可见性地原理:内存模型
synchronized可以保证可见性
Synchronized缺陷
效率低:锁的释放情况少、视图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程
不够灵活(读写锁更灵活):加锁和释放的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的
无法知道是否成功获取到锁
常见面试问题
使用注意点:锁的范围不宜过大、避免锁的嵌套
如何选择Lock和synchronized关键字?
synchronized能满足需求优先使用synchronized
lock更灵活,但是容易编写代码出错
多线程访问同步方法的各种具体情况
确定锁对象
思考题
Synchronized使得同时只有一个线程可以执行,性能较差,有什么办法可以提升性能?
如果是读多写少的情况下,可以使用读写锁代替
我想更灵活地控制锁地获取和释放(现在释放锁的时机都被规定死了),怎么办?、
可以考虑使用Lock
总结:
一句话介绍Synchronized:
JVM会自动通过使用monitor来加锁和解锁,保证了同时只有一个线程可以执行指定代码,从而保证了线程安全,同时具有可重入和不可中断的性质。
查看全部 -
Synchronized的地位
Synchronized是java的关键字,并java的怨言原生支持
是最基础的互斥同步手段
是并发编程中的元老级角色,是并发编程的必学内容
查看全部 -
Synchronized的作用:能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。
查看全部
举报