欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年04月24日 08:53:07   投稿:goldensun  
這篇文章主要介紹了Java多線程編程中線程鎖與讀寫鎖的使用示例,鎖是控制程序多線程并發(fā)的重要手段,需要的朋友可以參考下

線程鎖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; 
/* 
 * 問題:設計一個 緩存機制 的 偽代碼 
 *  從集合中讀取數(shù)據(jù),讀取不到,就寫入,再考慮多線程并發(fā)的情況  
 */ 
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();//只能有一條線程到這,寫鎖開啟,要寫入數(shù)據(jù)了 
        if (data.get(key) == null) { 
          value = obj;   
            /*先判斷數(shù)據(jù),如果不存在,才寫入,,因為 界時當寫鎖解除后,其他 
              線程,再想寫入時, 判斷到數(shù)據(jù)存在 ,就跳過了。就不會發(fā)生同時寫入的情況 
            */    
          data.put(key, value);  
        } 
        lock.writeLock().unlock();//寫完了,解鎖 
        lock.readLock().lock(); 
      } 
    } finally { 
      lock.readLock().unlock(); 
    }   
    return value; 
  } 

相關文章

  • spring boot啟動時mybatis報循環(huán)依賴的錯誤(推薦)

    spring boot啟動時mybatis報循環(huán)依賴的錯誤(推薦)

    今天小編抽時間給大家分享spring boot啟動時mybatis報循環(huán)依賴的錯誤,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-12-12
  • 那些年用httpclient時踩過的一些坑

    那些年用httpclient時踩過的一些坑

    這篇文章主要給大家介紹了關于那些年用httpclient時踩過的一些坑,文中通過示例代碼介紹的非常詳細,對大家學習或者使用httpclient具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Sharding JDBC讀寫分離實現(xiàn)原理及實例

    Sharding JDBC讀寫分離實現(xiàn)原理及實例

    這篇文章主要介紹了Sharding JDBC讀寫分離實現(xiàn)原理及實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • Spring入門到精通之注解開發(fā)詳解

    Spring入門到精通之注解開發(fā)詳解

    Spring是輕代碼而重配置的框架,配置比較繁重,影響開發(fā)效率,所以注解開發(fā)是一種趨勢。本文將通過示例為大家詳細講講Spring如何實現(xiàn)注解開發(fā),感興趣的可以學習一下
    2022-07-07
  • 識別率很高的java文字識別技術

    識別率很高的java文字識別技術

    這篇文章主要為大家詳細介紹了識別率很高的java文字識別技術,親測,希望對大家有幫助,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Jersey框架的統(tǒng)一異常處理機制分析

    Jersey框架的統(tǒng)一異常處理機制分析

    初學者往往不清楚java的異常為什么會設計成這個樣子,他們通常會對異常只進行簡單的處理
    2016-07-07
  • 解讀Spring-Context的作用及用法

    解讀Spring-Context的作用及用法

    這篇文章主要介紹了Spring-Context的作用及用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Netty分布式FastThreadLocal的set方法實現(xiàn)邏輯剖析

    Netty分布式FastThreadLocal的set方法實現(xiàn)邏輯剖析

    這篇文章主要為大家介紹了Netty分布式FastThreadLocal的set方法實現(xiàn)邏輯剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • SpringBoot?整合Redis?數(shù)據(jù)庫的方法

    SpringBoot?整合Redis?數(shù)據(jù)庫的方法

    Redis是一個基于內存的日志型可持久化的緩存數(shù)據(jù)庫,保存形式為key-value格式,Redis完全免費開源,它使用ANSI?C語言編寫。這篇文章主要介紹了SpringBoot?整合Redis?數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2018-03-03
  • Java讀取OpenSSL生成的PEM公鑰文件操作

    Java讀取OpenSSL生成的PEM公鑰文件操作

    這篇文章主要介紹了Java讀取OpenSSL生成的PEM公鑰文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論