社区
Java SE
帖子详情
线程问题,关于synchronized
gxiaoqiang1987
2008-11-18 04:40:33
synchronized void m1()这边锁住的是整个对象还是这个方法,是不是当有个线程在执行tt的m1()的时候,别的线程就不能执行tt的其它方法,要等人家执行完m1()后放了锁,才能执行tt的方法,实在是搞不清楚
还有,有的程序有synchronized(this){.....},这又是什么意思???
...全文
161
15
打赏
收藏
线程问题,关于synchronized
synchronized void m1()这边锁住的是整个对象还是这个方法,是不是当有个线程在执行tt的m1()的时候,别的线程就不能执行tt的其它方法,要等人家执行完m1()后放了锁,才能执行tt的方法,实在是搞不清楚 还有,有的程序有synchronized(this){.....},这又是什么意思???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
rubysun2008
2008-11-18
打赏
举报
回复
我看这贴子时还没人回答,正想回答,被叫去开会,回来都一大帮人回了,不给俺机会~~~喵~~
link_1029
2008-11-18
打赏
举报
回复
synchronized锁定的是对象,如果线程1在调用该对象的一个同步方法,则其他线程调用该对象的任何其他同步方法都必须等待线程1释放锁.但是其他线程是可以调用该对象的其他非同步方法的
languo
2008-11-18
打赏
举报
回复
可以执行 synchronized 锁住的是那个方法 或者是代码块synchronized(object){.....},
shenjie1989
2008-11-18
打赏
举报
回复
synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。
在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。
njzdl
2008-11-18
打赏
举报
回复
[Quote=引用 10 楼 njzdl 的回复:]
引用 4 楼 gxiaoqiang1987 的回复:
引用 1 楼 njzdl 的回复:
我觉得LZ的理解出了问题 所有的synchronized 锁住的都是对象,而不是方法~
那我问直接点,线程t执行m1()的过程中,tt.m2()可以执行吗?????
先回答YES or NO,
再说原因
当然可以,synchronized 你锁住了m1(),那么m2当然可以运行,如果你需要控制让m1运行,你就需要运用sleep();方法来实现了
[/Quote]
你如果想很好的理解synchronized ,你需要结合wait(),和notify(notifyAll)来理解,
首先wait和notify必须出现在synchronized 中,其次任何对象都具备了wait和notify方法。
也许这可以说明synchronized 锁住的是对象。
njzdl
2008-11-18
打赏
举报
回复
[Quote=引用 4 楼 gxiaoqiang1987 的回复:]
引用 1 楼 njzdl 的回复:
我觉得LZ的理解出了问题 所有的synchronized 锁住的都是对象,而不是方法~
那我问直接点,线程t执行m1()的过程中,tt.m2()可以执行吗?????
先回答YES or NO,
再说原因
[/Quote]
当然可以,synchronized 你锁住了m1(),那么m2当然可以运行,如果你需要控制让m1运行,你就需要运用sleep();方法来实现了
shaobentailang
2008-11-18
打赏
举报
回复
可以执行啊,synchronized只能保证其它线程不能访问该方法,但不代表其它线程不能运行
Iangao
2008-11-18
打赏
举报
回复
第2点: 改一下,是阻塞访问本对象sychronized方法(可以是同一个方法,也可以是不同的方法) 或对本对象执行了sychronized(obj)的线程.
Iangao
2008-11-18
打赏
举报
回复
1. sychronized(this) 和synchronized方法实现的是一样的功能,只不过可以控制临界区更小一些.
2. sychronized方法执行过程中只能阻塞访问本对象的其他sychronized方法,未同步的方法不受限制.因为它没有要求对象锁.
请参看:
基本同步原理
renmms
2008-11-18
打赏
举报
回复
[Quote=引用 4 楼 gxiaoqiang1987 的回复:]
引用 1 楼 njzdl 的回复:
我觉得LZ的理解出了问题 所有的synchronized 锁住的都是对象,而不是方法~
那我问直接点,线程t执行m1()的过程中,tt.m2()可以执行吗?????
先回答YES or NO,
再说原因
[/Quote]
NO。
synchronized Method(){}可以防止多个线程同时访问这个对象的Method方法.
这就是synchronized的作用
renmms
2008-11-18
打赏
举报
回复
是某个对象实例内,synchronized Method(){}可以防止多个线程同时访问这个对象的Method方法
(this)代表当前对象
gxiaoqiang1987
2008-11-18
打赏
举报
回复
[Quote=引用 1 楼 njzdl 的回复:]
我觉得LZ的理解出了问题 所有的synchronized 锁住的都是对象,而不是方法~
[/Quote]
那我问直接点,线程t执行m1()的过程中,tt.m2()可以执行吗?????
先回答YES or NO,
再说原因
njzdl
2008-11-18
打赏
举报
回复
[Quote=引用楼主 gxiaoqiang1987 的帖子:]
synchronized void m1()这边锁住的是整个对象还是这个方法,是不是当有个线程在执行tt的m1()的时候,别的线程就不能执行tt的其它方法,要等人家执行完m1()后放了锁,才能执行tt的方法,实在是搞不清楚
还有,有的程序有synchronized(this){.....},这又是什么意思???
[/Quote]
synchronized的作用是资源如果需要访问一个synchronized的对象时就需要得到该对象的锁,否则会抛出异常~
cangyue87
2008-11-18
打赏
举报
回复
在方法上就只锁方法,这个对象的其他方法依然不是线程安全的.
synchronized(this){.....}是为当前对象的某段代码加锁.
njzdl
2008-11-18
打赏
举报
回复
我觉得LZ的理解出了问题 所有的synchronized 锁住的都是对象,而不是方法~
2023最新,最全,最细的JUC多
线程
并发教程
紧接着由
线程
安全
问题
引出 Java 提供的两个解决
线程
安全
问题
的关键字:volatile 和
synchronized
,并带你们从 hotspot 源码层面详细分析了这两个关键字的实现流程。接着就是 Unsafe、CAS、LockSupport、ThreadLocal...
(一)
线程
安全
问题
-
线程
锁(
synchronized
的使用)
(一)
线程
安全
问题
诱因 存在有共享数据 存在有多个
线程
访问这些共享数据 解决方法:同一时刻共享数据只能由一个
线程
访问,其他
线程
要等到该
线程
处理完共享数据后才能对该
线程
进行操作 (二)
线程
锁-
synchronized
...
【多
线程
进阶】
synchronized
的总结
如果某一个资源被多个
线程
共享,为了避免因为资源抢占导致资源数据错乱,我们需要对
线程
进行同步,那么
synchronized
就是实现
线程
同步的关键字,可以说在并发控制中是必不可少的部分,今天就来看一下
synchronized
的...
线程
状态+
线程
安全
问题
+
synchronized
的用法
多
线程
安全
问题
,
线程
状态细化,
synchronized
的用法
【
线程
锁】
synchronized
所有用法汇总(包含this语法)
synchronized
作用于实例方法2.1 多个
线程
访问同一个对象的同一个
synchronized
方法2.2 多个
线程
访问同一个对象的不同的
synchronized
方法2.3 一个
线程
获取了该对象的锁之后,其他
线程
来访问其他非
synchronized
实例...
Java SE
62,614
社区成员
307,326
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章