我有以下代码.我希望一个线程完全执行其synchronized方法,然后允许另一个线程访问相同的方法.然而,这种情况并非如此.
public class Threads {
/**
* @param args
*/
public static void main(String[] args) {
//Thread Th = new Threads();
Thread th = new Thread (new thread1 ());
th.start();
Thread th1 = new Thread (new thread1 ());
th1.start();
}
}
class thread1 implements Runnable{
String name = "vimal";
public void run() {
System.out.println("Runnable "+this.name);
setNAme("Manish");
}
public synchronized void setNAme(String name){
try {
System.out.println("Thread "+Thread.currentThread().getName());
wait(1000);
this.name = name;
System.out.println("Name "+this.name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个输出
Runnable vimal
Thread Thread-0
Runnable vimal
Thread Thread-1
Name Manish
Name Manish
Run Code Online (Sandbox Code Playgroud)
这里同步的用途是什么,如何让我的方法在另一个访问之前完全运行?
synchronized有没有在这里的作用,因为你没有在这两种情况下,在同一对象上同步.应用于实例方法时,该synchronized关键字将导致同步该方法this.因此,在每种情况下,您都在同步实例thread1,其中有两个.
当您同时在两个线程中运行相同的实例时,将会有更有趣的测试thread1.在这种情况下,调用wait(1000)是一件非常糟糕的事情,因为(如文档所示)它会释放锁定this.您想Thread.sleep(1000)在代码中使用.
如果您需要有两个实例thread1,则需要在某些共享对象上进行同步,可能是这样的:
private static final Object lockObject = new Object();
public void setName(String newName) {
synchronized(lockObject) {
doSetName(newName);
}
}
Run Code Online (Sandbox Code Playgroud)