分类

  • 软件天地

  • java的线程安全四种方式五个等级‖
      sychronized method(){}                                 

      sychronized (objectR
    eference) {/*block*/}
      static synchronized method(){}                 
      sychronized(classname.class)                      
      其中1和2是代表锁当前
    对象,即一个对象就一个锁,3
    和4代表锁这个类,即这个类的锁
      要注意的是sychronize
    个方法都是sychronized,
    方法之一,不管是否同一个
    同reference调用了sychron
    d method()不是锁这个函数,而
    那么只要有两个线程共享一个该
    方法,都会用这个对象锁进行同
    ized区段的咚咚就会受类锁的控
    是锁对象,即:如果这个类中有两
    类的reference,每个调用这两个
    步。锁类的3和4类推,即该类的不


      还有,如果两个函数调用的先后顺序
    任务:
    不能被打断,那么可以有个专门的锁对象来完成这个

      class MyLock                                                      
      {                                                                            
         synchronized getLock()                            
         {                                                                      
           //####还没写完                                                
         }                                                                      
      }                                                                            

      五个等级  参见effective java I
    tem 52 : Document thread safety

      immutable  不可变对象                                             
      thread-safe 线程安全
    的,可以放心使用,如java.uti
    l.Timer
      conditionally thread-safe 条件线
    除非存在几个方法调用之间的顺序不能被
    程安全的,如Vector和Hashtable,一般是安全的,
    打断,这时可以用额外的锁来完成
      thread-compatible 可

    以使用synchronized (objectR

    eference)来协助完成对线程的调

      thread-hostile 不安全的                                        

      wait & notifyAll                                              

      在循环中使用wait 使用notifyAll而不是notify               

      pipe                                                                      

      java中也有pipe的,四
    pedOutputStream, PipedOu
    ):
    个类:PipedInputStream, Pipe
    tputWriter 下面是一段生产者

    dInputReader, Pi
    消费者的代码(摘自core javaII


        /* set up pipes */                                     
        PipedOutputStrea
    m pout1 = new PipedOutputStr
    eam();
        PipedInputStream pin1 = new
    PipedInputStream(pout1);
        PipedOutputStream pout2 = ne
    w PipedOutputStream();
        PipedInputStream
    pin2 = new PipedInputStream
    (pout2);
        /* construct threads */                           
        Producer prod = new Producer(pout1);

        Filter filt = ne
    w Filter(pin1, pout2);
        Consumer cons = new Consumer(pin2);   
        /* start threads */                                   
        prod.start(); filt.start();
    cons.start();



    上一页 下一页




    map