当前位置: 代码迷 >> J2SE >> java中线程同步的一个有关问题【synchronized】
  详细解决方案

java中线程同步的一个有关问题【synchronized】

热度:5284   发布时间:2013-02-25 00:00:00.0
java中线程同步的一个问题【synchronized】
首先感谢大家能注意到这个帖子,我是一个小菜鸟,很笨,但是还算勤奋吧。
大家先看下下面的这段代码,他的作用是用2个线程来实现不重复的打印出1-100的数字。
Java code
public class nnnn implements Runnable { static int i = 1; String name; private Object lockObject; nnnn(String name, Object o) { this.name = name; this.lockObject = o; } public void run() { dd(); } public synchronized void dd() { synchronized (lockObject) { int temp = 0; while (i < 100) { if (temp == 0) { System.out.println(name + " " + i); i++; temp = 1; lockObject.notify(); } else { temp = 0; try { lockObject.wait(); } catch (Exception e) { e.printStackTrace(); } } } } } public static void main(String args[]) { Object lockObject = new Object(); Thread p1 = new Thread(new nnnn("one", lockObject)); p1.start(); Thread p2 = new Thread(new nnnn("two", lockObject)); p2.start(); } } 

这段代码是我从别人那里得到的,我自己写的时候没有写出来。

我现在的疑问就是:

这段代码里,他用synchronized修饰了lockobject这个对象,也就是说这个锁,锁的就是这个对象。

但是P1和P2这两个线程里边,都有各自的lockobject对象。

解锁还需上锁人。

P1的lockobject把自己送到wait状态那么就要用P1的lockobject再把自己notify起来,

但是这段代码并不是这样啊,他是怎么实现的呢?

希望大家给指出来我的思路错在哪里,谢谢啦,分数不多,我刚刚来到CSDN,还望各位大哥大姐们多多帮助哈

------解决方案--------------------------------------------------------
但是P1和P2这两个线程里边,都有各自的lockobject对象。

p1,p2只是共享一个lockobject,就是你在main中定义的那个,你的两个线程只是把这同一个对象的引用给了两个不同的线程,所以还是一个lockobject
------解决方案--------------------------------------------------------
Object lockObject = new Object(); 
Thread p1 = new Thread(new nnnn("one", lockObject)); 
p1.start(); 
Thread p2 = new Thread(new nnnn("two", lockObject)); 
p2.start(); 

明显是两个线程使用的同一个对象lockObject。也就是说两个线程对同一份资源使用,
但是这份资源上锁了,一个线程把它锁上,用完后解锁,下一个线程就可以用了!
  相关解决方案