社区
Java EE
帖子详情
synchronized () 括号中应该传什么对象?
我纯洁全身都纯洁
2018-01-11 03:46:44
我看jdk源码的时候发现了这样的代码
同步锁中传入了静态的自定义的类“Lock”
1、这种写法和直接传this有什么区别?
2、类“Lock”定义成静态和不定义成静态有什么区别?
最好有代码可以分析说明下。
...全文
796
4
打赏
收藏
synchronized () 括号中应该传什么对象?
我看jdk源码的时候发现了这样的代码 同步锁中传入了静态的自定义的类“Lock” 1、这种写法和直接传this有什么区别? 2、类“Lock”定义成静态和不定义成静态有什么区别? 最好有代码可以分析说明下。
复制链接
扫一扫
分享
转发到动态
举报
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类的实例对象是同一个。
synchronized
()
括号
中
应该
传
什么
对象
?
我看jdk源码的时候发现了这样的代码 同步锁
中
传
入了静态的自定义的类“Lock” 1、这种写法和直接
传
this有什么区别? 2、类“Lock”定义成静态和不定义成静态有什么区别? 对于代码块同步,也就是
synchronized
(lock){} 这样的写法,lock这个
对象
就是 “锁”,当两个并行的线程a,b,当a先进入同步块,即a先拿到lock
对象
,这时候a就相当于用一把锁把synchroniz...
synchronized
代码块
括号
中
写什么?
1、
synchronized
锁住的是
括号
里的
对象
,而不是代码 2、当
synchronized
锁住一个
对象
后,别的线程如果也想拿到这个
对象
的锁,就必须等待这个线程执行完成释放锁,才能再次给
对象
加锁,这样才达到线程同步的目的 3、可以锁什么? 3.1、this:也就是当前
对象
,由于多线程下,创建的某各类的
对象
在堆
中
不是同一个,所以锁失效 3.2、类名.class:也就是某一类
对象
,例如Person类,那么当Person类被锁,只要是该类创建的所有
对象
,就都是互斥的 4、使用代码讲解这两种方式的区别 ``` pa
Synchronized
锁的到底是什么
对象
?
对于普通同步方法,锁的是 当前实例
对象
对于静态同步方法,锁的是 当前类的 Class
对象
对于同步方法块,锁的是
Synchronized
括号
中
的
对象
Java
中
synchronized
到底锁住的是什么?
Java
中
synchronized
到底锁住的是什么? 使用环境:多线程java程序
中
。 作用:在多线程的环境下,控制
synchronized
代码段不被多个线程同时执行。
synchronized
既可以加在一段代码上,也可以加在方法上。 使用:
synchronized
锁住的是
括号
里的
对象
,而不是代码。对于非static的
synchronized
方法,锁的就是
对象
本身也就是this。 通过以下三个案例...
synchronized
是如何锁住
对象
的?
synchronized
是Java
中
的关键字,
synchronized
可以保证方法或者代码块在运行时,同一时刻只有一个线程可以进入到被修饰的代码块
中
,同时它还可以保证共享变量的内存可见性,Java
中
每一个
对象
都可以作为锁,这是
synchronized
实现同步的基础。修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大
括号
{}括起来的代码,此时
synchronized
锁住的则是()
中
的
对象
。修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,
Java EE
67,549
社区成员
225,863
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章