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

首頁 > 編程 > Java > 正文

Java多線程編程中線程鎖與讀寫鎖的使用示例

2019-11-26 14:25:34
字體:
來源:轉載
供稿:網友

線程鎖Lock
Lock  相當于 當前對象的 Synchronized

import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /*  * Lock lock = new ReentrantLock();  * lock.lock();  lock.unLock();  * 類似于 synchronized,但不能與synchronized 混用  */ public class LockTest {   public static void main(String[] args) {     final Outer outer = new LockTest().new Outer();     new Thread(new Runnable() {        @Override       public void run() {         // TODO Auto-generated method stub         while (true) {           outer.out1("zhangxiaoxiao");           outer.out2("lihuoming");         }       }      }).start();     new Thread(new Runnable() {        @Override       public void run() {         // TODO Auto-generated method stub         while (true) {           outer.out1("zhangxiaoxiao");           outer.out2("lihuoming");         }       }      }).start();    }   class Outer {     Lock lock = new ReentrantLock();     void out1(String name) {       lock.lock();       int len = name.length();       for (int i = 0; i < len; i++) {         System.out.print(name.charAt(i));       }       System.out.println();       lock.unlock();     }     void out2(String name) {       lock.lock();       int len = name.length();       for (int i = 0; i < len; i++) {         System.out.print(name.charAt(i));       }       System.out.println();       lock.unlock();     }   } } 


讀寫鎖 ReentrantReadWriteLock

 讀寫鎖:允許多條線程同時讀;不能讀中有寫;不能寫中有讀;不能寫中有寫

import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /*  * 問題:設計一個 緩存機制 的 偽代碼  *  從集合中讀取數據,讀取不到,就寫入,再考慮多線程并發的情況   */ public class ReadWriteLockTest2 {   private Map<String, Object> data = new HashMap<String, Object>();   private ReadWriteLock lock = new ReentrantReadWriteLock();    //讀寫鎖   public Object getInstance1(String key, Object obj) {     lock.readLock().lock();     Object value = null;     try {       value = data.get(key);       if (value == null) {//一條線程進入這里,         lock.readLock().unlock();//讀鎖解了,其他線程就可能也到這了         lock.writeLock().lock();//只能有一條線程到這,寫鎖開啟,要寫入數據了         if (data.get(key) == null) {           value = obj;               /*先判斷數據,如果不存在,才寫入,,因為 界時當寫鎖解除后,其他               線程,再想寫入時, 判斷到數據存在 ,就跳過了。就不會發生同時寫入的情況             */              data.put(key, value);          }         lock.writeLock().unlock();//寫完了,解鎖         lock.readLock().lock();       }     } finally {       lock.readLock().unlock();     }       return value;   } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 佛坪县| 墨竹工卡县| 兴城市| 河北区| 江永县| 武威市| 马尔康县| 平原县| 陆丰市| 三江| 上林县| 双流县| 色达县| 宝丰县| 集安市| 井陉县| 峨眉山市| 射阳县| 定日县| 凤台县| 玉门市| 胶州市| 紫阳县| 泰安市| 八宿县| 吉林省| 台州市| 扶风县| 尼木县| 东乡| 万载县| 广水市| 麦盖提县| 山东| 藁城市| 梧州市| 佛教| 惠来县| 磴口县| 南岸区| 类乌齐县|