2017-05-03 44 views
-1
class Caller extends Thread 
{ 


    String s; 



    Caller(String s) 
    { 

     this.s=s; 
    } 


    void call(String msg) 
    { 
     synchronized (this) 
     { 
      System.out.print("["+msg); 

      try 
      { 
       Thread.sleep(1000); 
      } 
      catch(Exception e) 
      { 
       System.out.println(e); 
      } 
      System.out.println("]"); 
      try 
      { 
       Thread.sleep(1000); 
      } 
      catch(Exception e) 
      { 
       System.out.println(e); 
      } 
     } 

    } 

    public void run() 
    { 


     call(s); 
    } 

} 


public class SynchronisedBlock { 

    public static void main(String[] args) { 


     Caller c=new Caller("hi"); 
     Caller c1=new Caller("li"); 
     Caller c2=new Caller("wi"); 

     c.start(); 
     c1.start(); 
     c2.start(); 


    } 

} 


    public class SynchronisedBlock { 

     public static void main(String[] args) { 


      Caller c=new Caller("hi"); 
      Caller c1=new Caller("li"); 
      Caller c2=new Caller("wi"); 

      c.start(); 
      c1.start(); 
      c2.start(); 


     } 

    } 

我想获得同步访问调用()使用同步块,但没有得到该功能。当我把call()方法在另一个类,然后我得到所需的功能,但不是在此代码中。我错过了什么?谁能告诉我为什么?提前Thanx。为什么我没有在我的代码中获得同步访问?

+2

你正在'this'上同步,'this'每次调用每个'Caller'对象。你需要有一个公共的同步对象。 – SomeDude

+0

@svasa非常感谢你。 – Ankit

回答

0

正如@svasa所说,你需要有一个共同的同步对象。 代码最简单的工作示例是使用共享的lock对象。此外,lockfinal以防止它在代码中的其他位置被替换,您最终会在不同的对象上同步。 (感谢@PJMeisch):

class Caller extends Thread { 

    String s; 
    private static final Object lock = new Object(); 

    Caller(String s) { 

     this.s = s; 
    } 

    void call(String msg) { 
     synchronized (lock) { 
      System.out.print("[" + msg); 

      try { 
       Thread.sleep(1000); 
      } catch (Exception e) { 
       System.out.println(e); 
      } 
      System.out.println("]"); 
      try { 
       Thread.sleep(1000); 
      } catch (Exception e) { 
       System.out.println(e); 
      } 
     } 

    } 

    public void run() { 

     call(s); 
    } 
+0

请确保您的锁定对象是最终的,以防止它在代码中的其他位置被替换,最终会同步到不同的对象上。 –

+0

好,赶快,谢谢 - 更新了代码! –

+0

这不是最简单的方法。最简单的方法是实现'Runnable'而不是不适当地扩展'Thread'。那么'这个'可以工作。 –

0

如果喜欢它的应该不是一个Thread,它不是要,你run方法是在一个Runnable,那么你可以在同一个Runnable实例传递给每个线程和this将作为同步对象引用。

相关问题