线程同步不起作用

时间:2016-03-07 06:23:22

标签: java multithreading synchronization

我正在尝试使用以下代码实现同步,但它无法正常工作。

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]]的东西是不同步的。

3 个答案:

答案 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();
     }

}