大家先看下下面的这段代码,他的作用是用2个线程来实现不重复的打印出1-100的数字。
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,还望各位大哥大姐们多多帮助哈
7 个解决方案
#1
#2
但是P1和P2这两个线程里边,都有各自的lockobject对象。
p1,p2只是共享一个lockobject,就是你在main中定义的那个,你的两个线程只是把这同一个对象的引用给了两个不同的线程,所以还是一个lockobject
p1,p2只是共享一个lockobject,就是你在main中定义的那个,你的两个线程只是把这同一个对象的引用给了两个不同的线程,所以还是一个lockobject
#3
#4
Thread p1 = new Thread(new nnnn("one", lockObject));
这里边的 new nnnn("one", lockObject)不代表是创建了一个新的nnnn对象么?
或者我要是这样写:
nnnn r1=new nnnn("one", lockObject);
Thread p1=new Thread(r1);
这样是不是就是两个线程不能互相通信啦?
这里边的 new nnnn("one", lockObject)不代表是创建了一个新的nnnn对象么?
或者我要是这样写:
nnnn r1=new nnnn("one", lockObject);
Thread p1=new Thread(r1);
这样是不是就是两个线程不能互相通信啦?
#5
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。也就是说两个线程对同一份资源使用,
但是这份资源上锁了,一个线程把它锁上,用完后解锁,下一个线程就可以用了!
Thread p1 = new Thread(new nnnn("one", lockObject));
p1.start();
Thread p2 = new Thread(new nnnn("two", lockObject));
p2.start();
明显是两个线程使用的同一个对象lockObject。也就是说两个线程对同一份资源使用,
但是这份资源上锁了,一个线程把它锁上,用完后解锁,下一个线程就可以用了!
#6
我给你的代码修改了一下
class Test
{
public static void main(String args[])
{
Thread p1 = new Thread(new nnnn());
p1.start( );
Thread p2 = new Thread(new nnnn());
p2.start( );
}
}
class nnnn implements Runnable
{
static int i = 1;
String name;
public void run()
{
dd( );
}
public void dd()
{
boolean b = false;
while (i < 100)
{
System.out.println(Thread.currentThread( ).getName( ) + " " + i);
i++;
Thread.yield();
}
}
}
不用synchronized,更不用synchronized方法后又建个synchronized(Object){}
#7
因为:
class nnnn {
private Object lockObject; // 这里定义的只是一个引用
}
就算你new一千个nnnn对象, 其中lockObject都未有对应的实体,
那实体在那里呢? 是通过在nnnn的构造函数传入的.
而楼主的例子中只在main中创建过一个实体, 并通过各个构造函数传入到不同的nnnn对象中,
所以这些对象中的lockObject指向的是同一个实体
class nnnn {
private Object lockObject; // 这里定义的只是一个引用
}
就算你new一千个nnnn对象, 其中lockObject都未有对应的实体,
那实体在那里呢? 是通过在nnnn的构造函数传入的.
而楼主的例子中只在main中创建过一个实体, 并通过各个构造函数传入到不同的nnnn对象中,
所以这些对象中的lockObject指向的是同一个实体
#1
#2
但是P1和P2这两个线程里边,都有各自的lockobject对象。
p1,p2只是共享一个lockobject,就是你在main中定义的那个,你的两个线程只是把这同一个对象的引用给了两个不同的线程,所以还是一个lockobject
p1,p2只是共享一个lockobject,就是你在main中定义的那个,你的两个线程只是把这同一个对象的引用给了两个不同的线程,所以还是一个lockobject
#3
#4
Thread p1 = new Thread(new nnnn("one", lockObject));
这里边的 new nnnn("one", lockObject)不代表是创建了一个新的nnnn对象么?
或者我要是这样写:
nnnn r1=new nnnn("one", lockObject);
Thread p1=new Thread(r1);
这样是不是就是两个线程不能互相通信啦?
这里边的 new nnnn("one", lockObject)不代表是创建了一个新的nnnn对象么?
或者我要是这样写:
nnnn r1=new nnnn("one", lockObject);
Thread p1=new Thread(r1);
这样是不是就是两个线程不能互相通信啦?
#5
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。也就是说两个线程对同一份资源使用,
但是这份资源上锁了,一个线程把它锁上,用完后解锁,下一个线程就可以用了!
Thread p1 = new Thread(new nnnn("one", lockObject));
p1.start();
Thread p2 = new Thread(new nnnn("two", lockObject));
p2.start();
明显是两个线程使用的同一个对象lockObject。也就是说两个线程对同一份资源使用,
但是这份资源上锁了,一个线程把它锁上,用完后解锁,下一个线程就可以用了!
#6
我给你的代码修改了一下
class Test
{
public static void main(String args[])
{
Thread p1 = new Thread(new nnnn());
p1.start( );
Thread p2 = new Thread(new nnnn());
p2.start( );
}
}
class nnnn implements Runnable
{
static int i = 1;
String name;
public void run()
{
dd( );
}
public void dd()
{
boolean b = false;
while (i < 100)
{
System.out.println(Thread.currentThread( ).getName( ) + " " + i);
i++;
Thread.yield();
}
}
}
不用synchronized,更不用synchronized方法后又建个synchronized(Object){}
#7
因为:
class nnnn {
private Object lockObject; // 这里定义的只是一个引用
}
就算你new一千个nnnn对象, 其中lockObject都未有对应的实体,
那实体在那里呢? 是通过在nnnn的构造函数传入的.
而楼主的例子中只在main中创建过一个实体, 并通过各个构造函数传入到不同的nnnn对象中,
所以这些对象中的lockObject指向的是同一个实体
class nnnn {
private Object lockObject; // 这里定义的只是一个引用
}
就算你new一千个nnnn对象, 其中lockObject都未有对应的实体,
那实体在那里呢? 是通过在nnnn的构造函数传入的.
而楼主的例子中只在main中创建过一个实体, 并通过各个构造函数传入到不同的nnnn对象中,
所以这些对象中的lockObject指向的是同一个实体