package com.yonge.lock;
import java.util.Random;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 需求:多線程操作同一數據,可以多線程同時讀數據,只能一個線程修改數據;
* @author wb-gaoy
* @version $Id: ShareData.java,v 0.1 2011-12-31 下午3:00:09 wb-gaoy Exp $
*/
public class ShareData {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private String data;
public ShareData(String data) {
this.data = data;
}
/**
* 修改數據的方法
* @param str
*/
public void merge(String str) {
lock.writeLock().lock();
System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"
+ Thread.currentThread().getId() + " locking...");
try {
data = str;
System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"
+ Thread.currentThread().getId() + " 修改爲:" + str);
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"
+ Thread.currentThread().getId() + " unlock...");
lock.writeLock().unlock();
}
}
/**
* 獲取數據的方法
*/
public String get() {
lock.readLock().lock();
System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"
+ Thread.currentThread().getId() + " locking...");
try {
System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"
+ Thread.currentThread().getId() + " 獲取爲:" + data);
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.readLock().unlock();
System.out.println("ThreadName:" + Thread.currentThread().getName() + "-"
+ Thread.currentThread().getId() + " unlock...");
}
return data;
}
/**
* @param args
*/
public static void main(String[] args) {
final ShareData shareData = new ShareData("Hello,World!!");
for (int i = 0; i < 50; i++) {
new Thread(new Runnable() {
@Override
public void run() {
shareData.get();
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
shareData.merge(new Random().nextLong() + "");
}
}, "B").start();
}
}
/**
* 總結:
* 1、readLock在沒有被釋放的時候可以被多個線程同時讀取,此時還可以重入writeLock鎖
* 2、writeLock在沒有被釋放的時候其他鎖不能進入,也不能重入readLock鎖,直到writeLock被解鎖
*/
}
ReentrantReadWriteLock
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.