国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java多線程編程之Lock用法實例

2019-11-26 15:11:36
字體:
來源:轉載
供稿:網友

鎖是控制多個線程對共享資源進行訪問的工具。通常,鎖提供了對共享資源的獨占訪問。一次只能有一個線程獲得鎖,對共享資源的所有訪問都需要首先獲得鎖。不過,某些鎖可能允許對共享資源并發訪問,如 ReadWriteLock(維護了一對相關的鎖,一個用于只讀操作,另一個用于寫入操作) 的讀寫鎖。

1、Lock提供了無條件的、可輪詢的、定時的、可中斷的鎖獲取操作,所有加鎖和解鎖的方法都是顯式的。

public interface Lock{  void lock(); //加鎖  //優先考慮響應中斷,而不是響應鎖定的普通獲取或重入獲取  void lockInterruptibly() throws InterruptedException;  boolean tryLock(); //可定時和可輪詢的鎖獲取模式  boolean tryLock(long timeout,TimeUnit unit) throws InterruptedException;  void unlock(); //解鎖  Condition newCondition();}

2、ReentrantLock實現了lock接口,跟synchronized相比,ReentrantLock為處理不可用的鎖提供了更多靈活性。
3、使用lock接口的規范形式要求在finally塊中釋放鎖lock.unlock()。如果鎖守護的代碼在try塊之外拋出了異常,它將永遠不會被釋放。

以下模擬Lock用法:假設有兩個線程(A線程、B線程)去調用print(String name)方法,A線程負責打印'zhangsan'字符串,B線程負責打印'lisi'字符串。
1、當沒有為print(String name)方法加上鎖時,則會產生A線程還沒有執行完畢,B線程已開始執行,那么打印出來的name就會出現如下問題。

2、當為print(String name)方法加上鎖時,則會產生A執行完畢后,B線程才執行print(String name)方法,達到互斥或者說同步效果。

package com.ljq.test.thread; import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * 用Lock替代synchronized * * @author Administrator * */public class LockTest {   public static void main(String[] args) {    new LockTest().init();  }   private void init() {    final Outputer outputer = new Outputer();    //A線程    new Thread(new Runnable() {      @Override      public void run() {        while (true) {          try {            Thread.sleep(10);          } catch (InterruptedException e) {            e.printStackTrace();          }          outputer.output("zhangsan");        }       }    }).start();     //B線程    new Thread(new Runnable() {      @Override      public void run() {        while (true) {          try {            Thread.sleep(10);          } catch (InterruptedException e) {            e.printStackTrace();          }          outputer.output("lisi");        }       }    }).start();   }   static class Outputer {    Lock lock = new ReentrantLock();     /**     * 打印字符     *     * @param name     */    public void output(String name) {      int len = name.length();      lock.lock();      try {        for (int i = 0; i < len; i++) {          System.out.print(name.charAt(i));        }        System.out.println();      } finally {        lock.unlock();      }    }  }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 资中县| 嘉祥县| 淳安县| 泸溪县| 龙江县| 嘉义县| 昭通市| 泸州市| 江城| 新宁县| 达州市| 麻阳| 沭阳县| 浠水县| 合山市| 珠海市| 韶关市| 辽阳县| 高邑县| 永靖县| 汝南县| 阿拉善左旗| 蓝山县| 扎鲁特旗| 会东县| 泗洪县| 宿松县| 沂南县| 临桂县| 天祝| 抚宁县| 靖宇县| 涟水县| 张家口市| 海城市| 碌曲县| 台东县| 东阳市| 九龙坡区| 磴口县| 郓城县|