synchronized() { };
区块里的东西,我可以理解,即线程运行区块语句的时候不能被别的线程打断。
但是()里的参数,我怎么看书都理解不了,讲讲()传的参数不同会有什么不同的结果吧,举个例子更好,谢谢啦。

解决方案 »

  1.   

    synchronized (obj) {
             while (<condition does not hold>)
                 obj.wait();
             ... // Perform action appropriate to condition
    }
    进入同步块的线程即获得对象obj的monitor monitor有且只有一个
      

  2.   

    美女啊。。synchronized() { };
    区块里的东西,我可以理解,即线程运行区块语句的时候不能被别的线程打断。//你的理解是错的。只是不能被需要synchronized同一个对象的线程打断。不需要synchronized这个对象的线程一样可以打断但是()里的参数,我怎么看书都理解不了,讲讲()传的参数不同会有什么不同的结果吧,举个例子更好,谢谢啦。以前的日记
    4.关于synchronized
        这个关键字出现的目的是为了让几个线程能同步,举一个最简单的例子。一个电影院有20张票要卖,它有3个售票员。
        写个程序来证实一下不用synchronized的结果好了,需要使用sleep()函数来制造出这种可能(线程的执行时机谁也不能预料)出现的情况:
    public class Sell
    {
     public static void main(String [] args)
     {
      SellThread sell = new SellThread();
      Thread sell1 = new Thread(sell,"sellman1");
      Thread sell2 = new Thread(sell,"sellman2");
      Thread sell3 = new Thread(sell,"sellman3");
      sell1.start();
      sell2.start();
      sell3.start();
     }
    }class SellThread implements Runnable
    {
     private int i = 20;
     public void run()
     {
      while(true)
      {  
         if( i > 0)
         {
          try 
        {
        Thread.sleep(100);
        } catch(Exception e)
        {
        }
       
        System.out.println(Thread.currentThread().getName() + " sell " + i--);
        }
      }
     }
    }结果一共卖掉了22张票(估计电影院以为无缘无故多收了门票钱会很高兴,不过一会也许就要面对愤怒的顾客了....)
      这个时候我们的synchronized应该发挥作用了^^修改程序如下:
    public class Sell2
    {
     public static void main(String [] args)
     {
      SellThread sell = new SellThread();
      Thread sell1 = new Thread(sell,"sellman1");
      Thread sell2 = new Thread(sell,"sellman2");
      Thread sell3 = new Thread(sell,"sellman3");
      sell1.start();
      sell2.start();
      sell3.start();
     }
    }class SellThread implements Runnable
    {
     private int i = 20;
     String a = "now ok!";
     public void run()
     {
      while(true)
      {  
         synchronized(a)
         {
          if( i > 0)
          {
           try 
         {
          Thread.sleep(100);
         } catch(Exception e)
         {
         }
       
         System.out.println(Thread.currentThread().getName() + " sell " + i--);
        }
       }
      }
     }
    }    这样就好了只会卖20张票了, synchronized()中的括号中需要的是一个class的对象所以我们不能直接在括号中写上i,就定义了一个String的对象a,a的标志旗 (不知道说什么更合适)本来为1代表大家都能使用,这样一个售票员selln的卖票线程拿到了a以后他就可以开始卖票,同时他把a这个对象标志旗置为0, 然后其他售票员卖票的线程发现他们拿不到a这个对象了就只先搁置了.一直到selln的卖票线程释放了a,a的标志旗就又变成了1,这个时候其他售票员的卖票的线程就可以竞争了,看谁先拿到a这个对象.不过String a和卖票没什么关系,所以我们可以用this来代替synchronized()中的a,它和a的效果一样表示谁拿到了this对象才能执行.
        这里有两个容易误解的地方:
        (1).一个线程拿到synchronized的括号中的对象之后,其他也要需要拿到这个对象才能运行的线程不能被执行了.其实是其他线程也是可以执行的,但他们执行到了需要synchronized中对象的时候,他们发现对象的标志旗为0,所以只能又被搁置了。(看来幸运女神只能同时光顾一个人^^)所以我们用synchronized来使得线程同步的时候是以牺牲效率为代价的,所以不需要使用的地方就别用好了.    (2),一个线程拿到synchronized的括号中的对象之后,其他任何线程都不能执行了,其实假如其他不需要synchronized的对象才能继续执行的线程还是可以和拿到synchronized的括号中的对象的线程一起运行的。    有的方法前面被加上了synchronized.其实这个时候就是把这个方法的调用者,也就是this的标志旗置0了,他不能和其他需要this才能运行的线程一起执行,但可以和其他不需要这个this对象的线程一起运行。
      

  3.   

    每一个对象都有属于自己的一个monitor(监视器)
    线程要进入同步块之前 该对象的monitor必须是available的
    一旦该线程进入该块意味着对象的monitor已不再是available的了
    被它占用了 当然此时其它线程已不能再进入此同步块直到占有者结束业务脱离此块
    或wait
      

  4.   

    synchronized() { }; 
    区块里的东西,我可以理解,即线程运行区块语句的时候不能被别的线程打断。 
    但是()里的参数,我怎么看书都理解不了,讲讲()传的参数不同会有什么不同的结果吧,举个例子更好,谢谢啦。首先,你提的问题是关于线程的同步控制的。既然要同步,就得要求在哪一个对象上同步。synchronized() { }; 是要同步一段代码,而这个同步的动作就是针对 “()”里的这个对象的。如果在一个类里声明一个方法如:public synchrinzed String getValue(){return str;}//str 是全局变量
    那么这个同步,就是针对 这个类 的对象了,即在这个类的这个对象上同步。