我正在尝试使用以下代码实现同步,但它无法正常工作。
class Callme extends Thread{
synchronized void call( ) {
System.out.print("[" + "Hello");
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.out.println("Interrupted");
}
System.out.println("]");
}
public void run()
{
call();
}
}
public class Threads {
static void main(String args[]) {
Callme target = new Callme();
Callme target2 = new Callme();
target.start();
target2.start();
}}
输出应该是[Hello] [Hello]但它的类似[Hello [Hello]]的东西是不同步的。
答案 0 :(得分:3)
你的代码工作得很好IMO,事实上那里没有同步问题,
为什么不呢?:
类线程的每个对象都在调用自己的call
方法,并在应该的时候打印它们,它们实际上是在尝试获取相同的资源(System.out.print)但不是同步....
所以这是一个完全正确的行为,你会得到像
输出中的[你好[你好]]
。
答案 1 :(得分:1)
很多帮助答案都会出现在您的路上。但是,如果你能理解线程同步的基本概念,我认为它会更好。 因此,当您像上面所做的那样同步方法时,这意味着想要执行特定同步方法的特定线程确实需要锁定对象。因此,一旦从另一个线程获取了对象锁,那么特定线程将必须等到第一个线程释放对象的锁。
但是在这里你使用了两个独立的线程和两个独立的对象。很明显,你得到的是正确的。
答案 2 :(得分:0)
输出应该是[Hello [Hello]],因为你有两个新的线程,target,target2,而call()是Callme的成员方法.so target和 target2使用自己的call()。如果你想要Thread同步,你需要 make target和target2调用相同的方法call()。
例如:
enter code here
public class Callme扩展了Thread {
public void run()
{
Threads.call();
}
}
public class Threads {
synchronized static void call( ) {
System.out.print("[" + "Hello");
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.out.println("Interrupted");
}
System.out.println("]");
}
public static void main(String args[]) {
Callme target = new Callme();
Callme target2 = new Callme();
target.start();
target2.start();
}
}