为什么这个线程允​​许另一个线程访问其同步方法?

Vim*_*deo 1 java

我有以下代码.我希望一个线程完全执行其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)

这里同步的用途是什么,如何让我的方法在另一个访问之前完全运行?

Mar*_*ers 6

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)