synchronized () 括号中应该传什么对象?

我纯洁全身都纯洁 2018-01-11 03:46:44
我看jdk源码的时候发现了这样的代码

同步锁中传入了静态的自定义的类“Lock”
1、这种写法和直接传this有什么区别?
2、类“Lock”定义成静态和不定义成静态有什么区别?
最好有代码可以分析说明下。
...全文
798 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶飞舟 2018-01-11
  • 打赏
  • 举报
回复
多线程下锁必须保持唯一,static是一种实现方式
oyljerry 2018-01-11
  • 打赏
  • 举报
回复
静态对象属于类。所有实例和类对象都会用同一个锁。
Alvis_you 2018-01-11
  • 打赏
  • 举报
回复
这个锁的目的就是锁同一个对象才能控制并发问题,如果你这个类是个单例可以不用静态因为你new出来的对象唯一,话说new一个byte对象占用空间小一些同样能锁住代码块。
sjjk 2018-01-11
  • 打赏
  • 举报
回复
对于代码块同步,也就是synchronized(lock){} 这样的写法,lock这个对象就是 “锁”,当两个并行的线程a,b,当a先进入同步块,即a先拿到lock对象,这时候a就相当于用一把锁把synchronized里面的代码锁住了,现在只有a才能执行这块代码,而b就只能等待a用完了lock对象锁之后才能进入同步块。 那么,就有个问题,要达到这个目的,至少对于a,b两个线程来说,锁必须是唯一的,原因很显然,如果有两把锁,那么a,b大可以各持一把锁,同时进入同步块,这显然是不对的。 现在,对于你的两个问题: 先回答第二个:2、类“Lock”定义成静态和不定义成静态有什么区别? 建议使用静态,就如上面说的,锁必须是唯一的,而静态变量,尤其是像上那样定义同时实例化的变量能百分百保证锁是唯一的,而如果变量不是static的,那么你必须自己在代码里面控制,保证至少对于要同步的各个线程来说是唯一的。然后,对于你上面贴出来的代码,lock也必须是static的,因为setRunFinalizerOnExit方法是static的 然后,第一个问题: 1、这种写法和直接传this有什么区别? 本质上没有区别,对于同步线程来说都只是一个锁而已,那么,还是那个问题,必须保证锁是唯一的,this指的是当前类的当前实例,用this作为锁,就必须保证各个线程所持有的ShutDown类的实例对象是同一个。

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧