Synchronized引入是为了解决线程安全问题,主要思想是以阻塞的方式让资源在同一时刻只由一个线程去访问,即悲观锁思想;
可见性:是指当某个线程修改了共享变量的值,其他线程能否立刻知晓;
而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,
Monitor
对象,加synchronized和关键字后 Monitor对象会生效,通过进入与退出Monitor对象实现互斥、同步功能;Owner
表示监视器的所有者,同一时刻Monitor中只能由一个线程担任 Owner
;Monitor.Enter
指令,线程会占据这个对象的Owner;EntryList
排队等待(阻塞状态),当t1执行完毕会执行 Monitor.Exit
命令,线程释放对象的Owner,通知EntryList的线程去争抢Owner,所以synchronized是非公平的锁;Monitor中还有WaitSet,用于存储执行了objectX.wait() / wait(long)的线程,
锁重入:
对同一个都对象多次执行Monitor.Enter--------锁重入
为了避免锁重入增大开销,可以让synchronized锁住的粒度大一些,减少了Monitor.Enter和Monitor.Exit的次数
注意:
(1) 修饰同步代码块
synchronized(线程共享对象){ 同步代码块;} //较为灵活
(2) 在实例方法的声明上使用synchronized
表示线程共享对象一定是 this
,并且同步代码块是整个方法体 ;
(3) 在静态方法上使用synchronized表示共享 (保证静态变量的安全)
表示找类锁,类锁永远只有一把!就算创建了100个对象,类锁也只有一把!
而对象锁则是一个对象一把锁,100个对象100把锁;
本文发布于:2024-02-04 08:45:54,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170703413454086.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |