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