我在学习java线程(同步和锁),但不知何故,我找不到这两个东西之间的区别。
// Two different instances of SyncExample
Thread a1 = new Thread(new SyncExample(), "A");
Thread b1 = new Thread(new SyncExample(), "B");
// Same instance is passed to both the threads
SyncExample syn = new SyncExample();
Thread a2 = new Thread(syn, "A");
Thread b2 = new Thread(syn, "B");
// I believe in total 4 stacks are built.
a1.start();
b1.start();
a2.start();
b2.start();
public class SyncExample implements Runnable {
Object obj = new Object();
@Override
public void run() {
this.myName();
}
private void myName() {
synchronized (obj) {
System.out.print("Define" + Thread.currentThread().getName());
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
System.out.println(ex);
}
System.out.print("tly" + Thread.currentThread().getName());
}
System.out.println(" Maybe" + Thread.currentThread().getName());
}
}
public class SyncExample implements Runnable {
Object obj = new Object();
@Override
public void run() {
this.myName();
}
private void myName() {
synchronized (obj) {
System.out.print("Define" + Thread.currentThread().getName());
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
System.out.println(ex);
}
System.out.print("tly" + Thread.currentThread().getName());
}
System.out.println(" Maybe" + Thread.currentThread().getName());
}
}但这里的问题是,当我使用
1-相同的参考输出为:
DefineAtlyA MaybeA
DefineBtlyB MaybeB2-2个不同的实例:
DefineADefineBtlyAtlyB MaybeB
MaybeA你能给我解释一下当我们把runnable目标传递给Thread类时有什么区别吗? 1.相同的实例2.不同的实例
发布于 2013-03-04 15:36:43
在您的代码中,当您传递两个不同的实例( SyncExample类)时,每个实例都有自己的锁对象(由变量obj持有)。因为有两个不同的锁对象,所以每个线程获得一个锁并并行执行,导致线程A和B的交错输出(DefineADefineBtlyAtlyB MaybeB MaybeA)。
而当您传递相同的实例时,只有一个SyncExample类的实例。因此,只有一个锁对象的实例(由变量obj保存)。因此,这个锁对象将在两个线程之间共享。由于这种共享,只有一个线程(比如T1)能够进入synchronized块;另一个线程(比如T2)将一直等到T1存在synchronized块。因此,在执行过程中,首先会看到线程A的所有打印语句,然后是线程B的所有语句(DefineAtlyA MaybeA DefineBtlyB MaybeB)。
如果我概括一下这一点:当您传递不同的实例时,只有静态变量会影响线程的并行执行,但是当您传递单个实例时,静态变量和类级别变量(如代码中的obj变量)都会影响线程的并行执行。
发布于 2013-03-04 14:27:22
输出应该会提示您不同之处。
当您将相同的锁传递给两个不同的线程时,其中只有一个线程能够获取obj上的锁并执行synchronized块中的代码。
当您传入两个不同的SyncExample对象时,这两个线程都能够同时执行,因为它们在不同的对象上同步。
https://stackoverflow.com/questions/15195735
复制相似问题