<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    線程--鎖

    Posted on 2009-12-22 21:10 啥都寫點 閱讀(514) 評論(0)  編輯  收藏 所屬分類: J2SE
           ReentrantLock類實現了Lock接口,通過它可以完全取代synchronized關鍵字
           ReentrantLock的lock方法取得鎖,如果該鎖定沒有被其他線程占據,則獲取該鎖定并返回,將保持計數器置為1;如果當前線程已經占據鎖,則立即返回,將保持計數器加1;如果鎖定被其他線程占據,則當前線程進入睡眠狀態,等待其他線程釋放鎖,此事保持計數器為1.
           ReentrantLock的unlock方法釋放鎖,如果當前線程是鎖的占有者,則將保持計數器減1,如果保持計算器等于0,則釋放鎖。如果當前線程不是鎖的占有者,則拋出異常。
           ReadWriteLock是一個繼承Lock的接口,定義了讀寫鎖。它的一個實現類是ReentrantReadWriteLock。
           ReentrantReadWriteLock的writeLock方法獲得用于寫入操作的鎖定,當獲得寫入鎖時,其他線程想進行讀寫操作都必須等待。
           ReentrantReadWriteLock的readLock方法獲得用于讀操作的鎖定,當獲得讀取鎖時,其他讀的線程可以繼續獲得讀取鎖,但是不能獲得寫入鎖。

    package book.j2se5.thread;

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;

    /**
     * Lockers
     * 在多線程編程里面一個重要的概念是鎖定,如果一個資源是多個線程共享的,為了保證數據的完整性,
     * 在進行事務性操作時需要將共享資源鎖定,這樣可以保證在做事務性操作時只有一個線程能對資源進行操作,
     * 從而保證數據的完整性。在5.0以前,鎖定的功能是由Synchronized關鍵字來實現的。
     
    */

    public class Lockers {
        
        
    /**
         * 測試Lock的使用。在方法中使用Lock,可以避免使用Synchronized關鍵字。
         
    */

        
    public static class LockTest {

            Lock lock 
    = new ReentrantLock();// 鎖
            double value = 0d; // 值
            int addtimes = 0;

            
    /**
             * 增加value的值,該方法的操作分為2步,而且相互依賴,必須實現在一個事務中
             * 所以該方法必須同步,以前的做法是在方法聲明中使用Synchronized關鍵字。
             
    */

            
    public void addValue(double v) {
                lock.lock();
    // 取得鎖
                System.out.println("LockTest to addValue: " + v + "   "
                        
    + System.currentTimeMillis());
                
    try {
                    Thread.sleep(
    1000);
                }
     catch (InterruptedException e) {
                }

                
    this.value += v;
                
    this.addtimes++;
                lock.unlock();
    // 釋放鎖
            }


            
    public double getValue() {
                
    return this.value;
            }

        }

        
    public static void testLockTest() throws Exception{
            
    final LockTest lockTest = new LockTest();
            
    // 新建任務1,調用lockTest的addValue方法
            Runnable task1 = new Runnable(){
                
    public void run(){
                    lockTest.addValue(
    55.55);
                }

            }
    ;
            
    // 新建任務2,調用lockTest的getValue方法
            Runnable task2 = new Runnable(){
                
    public void run(){
                    System.out.println(
    "value: " + lockTest.getValue());
                }

            }
    ;
            
    // 新建任務執行服務
            ExecutorService cachedService = Executors.newCachedThreadPool();
            Future future 
    = null;
            
    // 同時執行任務1三次,由于addValue方法使用了鎖機制,所以,實質上會順序執行
            for (int i=0; i<3; i++){
                future 
    = cachedService.submit(task1);
            }

            
    // 等待最后一個任務1被執行完
            future.get();
            
    // 再執行任務2,輸出結果
            future = cachedService.submit(task2);
            
    // 等待任務2執行完后,關閉任務執行服務
            future.get();
            cachedService.shutdownNow();
        }

        
        
    /**
         * ReadWriteLock內置兩個Lock,一個是讀的Lock,一個是寫的Lock。
         * 多個線程可同時得到讀的Lock,但只有一個線程能得到寫的Lock,
         * 而且寫的Lock被鎖定后,任何線程都不能得到Lock。ReadWriteLock提供的方法有:
         * readLock(): 返回一個讀的lock 
         * writeLock(): 返回一個寫的lock, 此lock是排他的。
         * ReadWriteLockTest很適合處理類似文件的讀寫操作。
         * 讀的時候可以同時讀,但不能寫;寫的時候既不能同時寫也不能讀。
         
    */

        
    public static class ReadWriteLockTest{
            
    // 鎖
            ReadWriteLock lock = new ReentrantReadWriteLock();
            
    // 值
            double value = 0d;
            
    int addtimes = 0;
            
            
    /**
             * 增加value的值,不允許多個線程同時進入該方法
             
    */

            
    public void addValue(double v) {
                
    // 得到writeLock并鎖定
                Lock writeLock = lock.writeLock();
                writeLock.lock();
                System.out.println(
    "ReadWriteLockTest to addValue: " + v + "   "
                        
    + System.currentTimeMillis());
                
    try {
                    Thread.sleep(
    1000);
                }
     catch (InterruptedException e) {
                }

                
    try {
                    
    // 做寫的工作
                    this.value += v;
                    
    this.addtimes++;
                }
     finally {
                    
    // 釋放writeLock鎖
                    writeLock.unlock();
                }

            }

            
    /**
             * 獲得信息。當有線程在調用addValue方法時,getInfo得到的信息可能是不正確的。
             * 所以,也必須保證該方法在被調用時,沒有方法在調用addValue方法。
             
    */

            
    public String getInfo() {
                
    // 得到readLock并鎖定
                Lock readLock = lock.readLock();
                readLock.lock();
                System.out.println(
    "ReadWriteLockTest to getInfo   "
                        
    + System.currentTimeMillis());
                
    try {
                    Thread.sleep(
    1000);
                }
     catch (InterruptedException e) {
                }

                
    try {
                    
    // 做讀的工作
                    return this.value + " : " + this.addtimes;
                }
     finally {
                    
    // 釋放readLock
                    readLock.unlock();
                }

            }

        }

        
        
    public static void testReadWriteLockTest() throws Exception{
            
    final ReadWriteLockTest readWriteLockTest = new ReadWriteLockTest();
            
    // 新建任務1,調用lockTest的addValue方法
            Runnable task_1 = new Runnable(){
                
    public void run(){
                    readWriteLockTest.addValue(
    55.55);
                }

            }
    ;
            
    // 新建任務2,調用lockTest的getValue方法
            Runnable task_2 = new Runnable(){
                
    public void run(){
                    System.out.println(
    "info: " + readWriteLockTest.getInfo());
                }

            }
    ;
            
    // 新建任務執行服務
            ExecutorService cachedService_1 = Executors.newCachedThreadPool();
            Future future_1 
    = null;
            
    // 同時執行5個任務,其中前2個任務是task_1,后兩個任務是task_2
            for (int i=0; i<2; i++){
                future_1 
    = cachedService_1.submit(task_1);
            }

            
    for (int i=0; i<2; i++){
                future_1 
    = cachedService_1.submit(task_2);
            }

            
    // 最后一個任務是task_1
            future_1 = cachedService_1.submit(task_1);
            
    // 這5個任務的執行順序應該是:
            
    // 第一個task_1先執行,第二個task_1再執行;這是因為不能同時寫,所以必須等。
            
    // 然后2個task_2同時執行;這是因為在寫的時候,就不能讀,所以都等待寫結束,
            
    // 又因為可以同時讀,所以它們同時執行
            
    // 最后一個task_1再執行。這是因為在讀的時候,也不能寫,所以必須等待讀結束后,才能寫。
            
            
    // 等待最后一個task_2被執行完
            future_1.get();
            cachedService_1.shutdownNow();
        }


        
    public static void main(String[] args) throws Exception{
            Lockers.testLockTest();
            System.out.println(
    "---------------------");
            Lockers.testReadWriteLockTest();
        }

    }



                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 亚洲H在线播放在线观看H| 亚洲日本中文字幕| 久久人午夜亚洲精品无码区| 在线观看H网址免费入口| 久久亚洲AV无码精品色午夜| 99久久久国产精品免费牛牛四川 | 免费国产黄网站在线看| 国产成人免费ā片在线观看| 国产精品自拍亚洲| 国产成人精品久久亚洲| 中文字幕在线免费播放| 亚洲成人动漫在线| 2021免费日韩视频网| 亚洲精品天堂成人片AV在线播放| 免费看大美女大黄大色| 草久免费在线观看网站| 亚洲成av人片天堂网| 日本片免费观看一区二区| 亚洲一卡2卡3卡4卡乱码 在线| 国产又大又粗又硬又长免费| 一级特黄a免费大片| 亚洲av网址在线观看| 日韩精品无码区免费专区| 美女视频免费看一区二区| 亚洲一区二区三区无码中文字幕| 日韩精品久久久久久免费| 亚洲色大成网站www永久男同| 亚洲国产成人精品91久久久| 国产激情免费视频在线观看 | 好男人看视频免费2019中文 | 日日夜夜精品免费视频| 国产精品免费αv视频| 久久精品国产精品亚洲毛片| 日韩一级在线播放免费观看| 一级视频在线免费观看| 亚洲资源在线观看| 四虎影视在线永久免费看黄| 久操免费在线观看| 亚洲妇女无套内射精| 久久久无码精品亚洲日韩蜜桃| 午夜视频在线在免费|