线程问题,关于synchronized

gxiaoqiang1987 2008-11-18 04:40:33



synchronized void m1()这边锁住的是整个对象还是这个方法,是不是当有个线程在执行tt的m1()的时候,别的线程就不能执行tt的其它方法,要等人家执行完m1()后放了锁,才能执行tt的方法,实在是搞不清楚

还有,有的程序有synchronized(this){.....},这又是什么意思???
...全文
161 15 打赏 收藏 转发到动态 举报
写回复
用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 锁住的都是对象,而不是方法~

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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