Java Code之线程与同步(二)

 接Java Code之线程与同步(一)的例子,使用synchronized来挂锁。实际上这个锁的效率并不高,分析一下,如果门外排队的都是读数据的人,那么这些人是可以同时进入屋子里的,他们不会影响数据的配对。也就是说可以多个读数据操作同时进行,写数据操作只能同时有一个,并且在写数据时,不能读数据。

Java中就有一个这样的挂锁机制,看代码:

如之前的例子,只需修改FileManager.java

Java代码 复制代码  收藏代码
  1. package com.iteye.badpie.javacode.thread.sync;   
  2.   
  3. import java.util.Random;   
  4. import java.util.concurrent.locks.Lock;   
  5. import java.util.concurrent.locks.ReentrantReadWriteLock;   
  6.   
  7. public class FileManager {   
  8.   
  9.     private Random mRandom;   
  10.     private String mName = "默认名字";   
  11.     private String mEmail = "默认电子邮件";   
  12.     private Lock mReadLock;   
  13.     private Lock mWriteLock;   
  14.   
  15.     public FileManager() {   
  16.         mRandom = new Random();   
  17.   
  18.         // 构建读写锁   
  19.         ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();   
  20.         mReadLock = rwLock.readLock();   
  21.         mWriteLock = rwLock.writeLock();   
  22.     }   
  23.   
  24.     public void write(String id, String name, String email) {   
  25.         // 写锁   
  26.         mWriteLock.lock();   
  27.         mName = name;   
  28.         try {   
  29.             Thread.sleep(getRandomInt());   
  30.         } catch (InterruptedException e) {   
  31.             e.printStackTrace();   
  32.         }   
  33.         mEmail = email;   
  34.         System.out.println(String.format("写数据 id:%s, name:%s, email:%s", id, name, email));   
  35.         // 解写锁   
  36.         mWriteLock.unlock();   
  37.     }   
  38.   
  39.     public void read(String id) {   
  40.         // 读锁   
  41.         mReadLock.lock();   
  42.         try {   
  43.             Thread.sleep(getRandomInt());   
  44.         } catch (InterruptedException e) {   
  45.             e.printStackTrace();   
  46.         }   
  47.         System.out.println(String.format("读数据 id:%s, name:%s, email:%s", id, mName, mEmail));   
  48.         // 解读锁   
  49.         mReadLock.unlock();   
  50.     }   
  51.   
  52.     private int getRandomInt() {   
  53.         return mRandom.nextInt(2000);   
  54.     }   
  55.   
  56. }  

你可能感兴趣的:(java)