Heim  >  Artikel  >  Java  >  Beispiele für die Verwendung von Thread-Sperren und Lese-/Schreibsperren in der Java-Multithread-Programmierung

Beispiele für die Verwendung von Thread-Sperren und Lese-/Schreibsperren in der Java-Multithread-Programmierung

高洛峰
高洛峰Original
2017-01-05 16:39:101435Durchsuche

Thread-Sperre Sperre
Sperre entspricht der synchronisierten

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(); 
    } 
  } 
}

Lese-/Schreibsperre des aktuellen Objekts ReentrantReadWriteLock

Lese-/Schreibsperre: Ermöglicht mehrere Threads gleichzeitig lesen; es kann nicht geschrieben werden; es kann nicht geschrieben werden; es kann nicht geschrieben werden.

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; 
  }


Thread-Sperren und Lese-/Schreibsperren in der Java-Multithread-Programmierung. Für verwandte Artikel beachten Sie bitte die chinesische PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn