国产探花免费观看_亚洲丰满少妇自慰呻吟_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();      }    }  }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平乐县| 洛宁县| 屏南县| 高陵县| 台江县| 若尔盖县| 呼和浩特市| 松阳县| 正宁县| 永和县| 海阳市| 宜昌市| 丘北县| 宁南县| 惠来县| 泰兴市| 嫩江县| 涿州市| 长武县| 即墨市| 昌平区| 新绛县| 南城县| 吉木乃县| 哈巴河县| 兴化市| 呼玛县| 西丰县| 湖口县| 郧西县| 长兴县| 林口县| 新巴尔虎右旗| 霍城县| 靖边县| 马鞍山市| 内丘县| 调兵山市| 宜都市| 随州市| 随州市|