Java 为什么同步方法不起作用?
我正在使用synchronized语句并制作以下程序…将runn类与此作为对象引用进行同步..bt smhw所需的输出不在那里Java 为什么同步方法不起作用?,java,multithreading,Java,Multithreading,我正在使用synchronized语句并制作以下程序…将runn类与此作为对象引用进行同步..bt smhw所需的输出不在那里 class runn extends Thread { String s; runn(String a) { s=a; start(); } public void show() { System.out.print("["+s); try {
class runn extends Thread {
String s;
runn(String a) {
s=a;
start();
}
public void show() {
System.out.print("["+s);
try {
sleep(50);
} catch(Exception a){}
System.out.print("]");
}
public void run() {
synchronized(this) {
show();
}
}
}
public class multi4 {
public static void main(String[] args) throws InterruptedException{
new runn("hello ");
new runn("this is ");
new runn("multithreading");
}
}
输出应为:
[hello][this is][multithreading]
但同步在smhw中不起作用
请帮助。两个错误:
- 您可以对单个
对象执行runn
。这没有效果,因为每个线程使用不同的同步对象synchronized
关键字不会神奇地导致线程按顺序运行。如果在同一对象上进行同步,它只会阻止线程尝试同时执行synchronized
块。它们仍然可以按任何顺序运行,但不能交错输出。也就是说,如果您在共享对象上进行了synchronized
,您可以获得例如同步
,但不能获得[这是][你好][多线程]
[这是[你好][多线程]]
上同步此
,因为每个线程都有自己的实例,所以你什么也做不到。您必须在所有线程的同一个实例上进行同步。@user2737412:这就是问题所在。启动线程及其构造函数也是一种非常糟糕的方式。在我们进行此操作时,扩展thread类也是一种糟糕的方式。等等,我想我已经掌握了这个问题的诀窍……让我快速解决。谢谢你。。。我传递了我想要调用同步函数的对象…它工作了..因为对象是通过引用传递的:再次感谢