• 一个多线程同步问题


    昨天,路过https://forums.oracle.com/message/10448617的时候,发现了这个问题:

    class SyncClass
    {
         synchronized void synMthd(String s)
         {
              System.out.println("[ "+s);
              try
              {
                   Thread.sleep(3000);
              }
              catch(Exception e)
              {
                   System.out.println(e);
              }
              System.out.println(" ]");
         }
    }
    class Test implements Runnable
    {
         public static void main(String ar[])
         {
              Test tt = new Test();
              Thread t1 = new Thread(tt,"T1");
              Thread t2 = new Thread(tt,"T2");
              t1.start();
              t2.start();
         }
         public void run()
         {
              SyncClass syn = new SyncClass();
              Thread th = Thread.currentThread();
              // synchronized(syn)
           // {
                   syn.synMthd(th.getName());
            // }
         }    
    }   

    输出结果如图: 

    也就是说 synchronized不起作用了,为什么没有实现同步,让下一个线程处于阻塞状态,下面我想就这个问题谈点自己的观点:

    其实

    synchronized void synMthd(String s)

     {          

    System.out.println("[ "+s);          

         try{               

              Thread.sleep(3000);         

         }          

        catch(Exception e)        

       {               

            System.out.println(e);          

        }          

    System.out.println(" ]");     

    }

    代码块确实被锁住了,但是在Thread的run方法中创建了对象SyncClass syn = new SyncClass();

    因为run这个方法或当前对象没有被锁住,也就是说T1和T2两个线程,分别执行run的时候,创建了两个对象,因为SyncClass的Class类没有被锁住,

    所以同时创建了两个对象,当线程T2在调用synMthd(String s)的时候输出 [ T2 ,还没有往

    下走的时候,另外一个线程也执行到了这里,并且调用了另外一个对象的该代码块同一时间输出了[ T1,这样就造成synchronized不起作用的结果。

    如果在run中锁定this,也就是Test的Class类或着修改成:

    public void run() {  

    SyncClass syn = new SyncClass();  

    Thread th = Thread.currentThread();

      synchronized (syn.getClass()) {

       syn.synMthd(th.getName());  

    }

     }

    的使用都可以阻塞下一个线程实现同步的。


        

    钟声敲响了日落
  • 相关阅读:
    OpenGL ES应用开发实践指南:iOS卷
    WCF(1)----服务创建
    算法设计--电路布线问题(分支限界法求解)
    Oracle 删除用户和表空间
    从最简单的源代码开始,切勿眼高手低---(第一波)
    pinyin4j的使用
    ios学习:AVAudioPlayer播放音乐文件及读取ipod库中的音乐文件
    ArcGIS多面体(multipatch)解析——引
    [珠玑之椟]位向量/位图的定义和应用
    搭建自己的XenServer+CloudStack云平台,提供IaaS服务(一)环境搭建
  • 原文地址:https://www.cnblogs.com/SATinnovation/p/3249063.html
Copyright © 2020-2023  润新知