package org.cxg.thread;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class CacheDome {
private Map<String, Object> map = new HashMap<String, Object>();
public static void main(String args[]){
final Business business = new Business();
new Thread(new Runnable() {
public void run() {
business.sub1();
}
}).start();
new Thread(new Runnable() {
public void run() {
business.sub2();
}
}).start();
new Thread(new Runnable() {
public void run() {
business.sub3();
}
}).start();
}
//线程读写锁
private ReadWriteLock readwrite = new ReentrantReadWriteLock();
public Object getData(String key){
readwrite.readLock().lock(); //读锁
Object value = null;
try{
value = map.get(key);
if(value == null){
readwrite.readLock().unlock(); //如果Value为空,则释放读锁。
readwrite.writeLock().lock(); //锁定写锁
try{
if(value == null){
value = "aaa";
}
}finally{
readwrite.writeLock().unlock();
}
}
return value;
}finally{
readwrite.readLock().unlock();
}
}
//线程间的通信
static class Business{
Lock lock = new ReentrantLock();
private int flag = 1;
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
public void sub1(){
lock.lock();
try{
if(flag != 1){
try {
condition1.await();//阻塞队列
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 0; i < 50; i ++){
System.out.println("this is sub1");
}
flag = 2;
condition2.signal(); //通知队列
}finally{
lock.unlock();
}
}
public void sub2(){
lock.lock();
try{
if(flag != 2){
try {
condition2.await();//阻塞队列
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 0; i < 50; i ++){
System.out.println("this is sub2");
}
flag = 3;
condition3.signal(); //通知队列
}finally{
lock.unlock();
}
}
public void sub3(){
lock.lock();
try{
if(flag != 3){
try {
condition3.await();//阻塞队列
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i = 0; i < 50; i ++){
System.out.println("this is sub3");
}
flag = 3;
condition1.signal(); //通知队列
}finally{
lock.unlock();
}
}
}
}