您好,欢迎来到年旅网。
搜索
您的当前位置:首页关于 Java synchronized(this) 的问题?

关于 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(); 

}
  |  浏览 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
运行结果根本就不是这么一回事,你这是误人子弟。
| 2016-2-26 14:02
回复 Free_King_Lx:这才是正解
| 2015-12-27 21:53
回复 Free_King_Lx: 我试着改写代码并运行后也确实出现了ta,tb线程和tc,td线程互相抢临界资源的现象。然而由于ab为一把锁,cd为一把锁。所以ab之间并不会争抢临界资源,cd也是如此。当然,我也是一个java初学者,如有错误欢迎大家指正!
| 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就两个实例,此时再运行便会因为锁有两个,会引发线程安全问题!
| 2014-12-18 13:22
真是全网最佳解答,网上找了这么多,都解释的糊里糊涂的,唯有此解答清晰明了,通俗易懂

1

采纳率:58% 来自: 擅长:     

其他回答

嗯,楼上解说正确,不罗嗦了。
  |  2011-12-03 15:37

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务