关于 Java synchronized(this) 的问题?

关于 Java synchronized(this) 的问题?

public class Thread1 implements Runnable {
public void run() {
synchronized(this) { //请问这里的this怎样理解,t1和t2的地址不是不一样嘛,怎么会只有一个线程运行???
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " synchronized loop " + i); 
}


public static void main(String[] args) {
Thread1 t1 = new Thread1();
Thread ta = new Thread(t1, "A");
Thread tb = new Thread(t1, "B");
ta.start();
tb.start(); 

}
收起
canmr  |  浏览 13738 次   2011-11-29 15:18
2011-11-29 16:05 最佳答案
synchronized(this)  

        这里的this是指当前对象,也就是说不管ta还是tb,刚开始运行这段代码的时候会给这段代码加个锁,这样即使运行到中间被替换了,另一个线程也不会执行这段代码,因为这段代码加锁了,而钥匙在给代码加锁的那个线程手里,只有加锁的线程运行完这段代码,才会给代码解锁.然后其他线程才能执行这段代码..

加个synchronized(this)以后运行结果是这样:
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
A synchronized loop 3
A synchronized loop 4
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
B synchronized loop 3
B synchronized loop 4

不加的话是这样:(顺序乱了,有好多种结果,这里只是其中一种)..
A synchronized loop 0
B synchronized loop 0
A synchronized loop 1
B synchronized loop 1
A synchronized loop 2
B synchronized loop 2
A synchronized loop 3
B synchronized loop 3
B synchronized loop 4
A synchronized loop 4
吊丝一拖 | 2016-3-23 14:56
运行结果根本就不是这么一回事,你这是误人子弟。 回复
zhxmlgh | 2016-2-26 14:02
回复 Free_King_Lx:这才是正解 回复
Free_King_Lx | 2015-12-27 21:53
回复 Free_King_Lx: 我试着改写代码并运行后也确实出现了ta,tb线程和tc,td线程互相抢临界资源的现象。然而由于ab为一把锁,cd为一把锁。所以ab之间并不会争抢临界资源,cd也是如此。当然,我也是一个java初学者,如有错误欢迎大家指正! 回复
Free_King_Lx | 2015-12-27 21:48
此处的this应为Thread1的对象。所以其实ta和tb实例应该都是不带锁的。因为ta和tb都是Thread类的对象。所以只有等ta完成后解锁才能让tb线程进去运行。而如果此时将代码main()块内再new一个 Thread1 t2 = new Thread1();并再建立基于t2的tc和td再start。这是就会有this就两个实例,此时再运行便会因为锁有两个,会引发线程安全问题! 回复
强人锁男6600 | 2014-12-18 13:22
真是全网最佳解答,网上找了这么多,都解释的糊里糊涂的,唯有此解答清晰明了,通俗易懂 回复

12下一页>

其他回答

嗯,楼上解说正确,不罗嗦了。
PythonScanner    |  2011-12-03 15:37
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值