package com.game.distributed.locak;
public interface ReadWriteLock {
public boolean readLock();
public void readUnLock();
public boolean writeLock();
public void writeUnLock();
}
package com.game.distributed.locak;
import java.util.concurrent.atomic.AtomicInteger;
public class CurrentReadWriteLock implements ReadWriteLock {
private boolean isRead;
private boolean isWrite;
private AtomicInteger readLocks = new AtomicInteger();
@Override
public synchronized boolean readLock() {
try {
while (isWrite) {
wait();
}
System.out.println(Thread.currentThread().getName() + "获得读锁成功");
readLocks.incrementAndGet();
isRead = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
@Override
public synchronized void readUnLock() {
System.out.println(Thread.currentThread().getName() + "释放读锁成功");
if(readLocks.decrementAndGet() <= 0) {
isRead = false;
}
notifyAll();
}
@Override
public synchronized boolean writeLock() {
try {
while (isRead || isWrite) {
wait();
}
System.out.println(Thread.currentThread().getName() + "获得写锁成功");
isWrite = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
@Override
public synchronized void writeUnLock() {
System.out.println(Thread.currentThread().getName() + "释放写锁成功");
isWrite = false;
notifyAll();
}
}
package com.ant;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.game.distributed.locak.CurrentReadWriteLock;
import com.game.distributed.locak.ReadWriteLock;
public class AntTest {
public static int[] numbers = { 5, 2, 1, 5, 12, 545, 121, 56, 787, 34, 121,
1222, 545, 546, 576, 172 };
public static void main(String[] args) {
List<Integer> data = new ArrayList<Integer>();
ReadWriteLock lock = new CurrentReadWriteLock();
Thread writer1 = new Thread(new Writer(data, lock,5000),"writer1");
Thread writer2 = new Thread(new Writer(data, lock,6000),"writer2");
Thread writer3 = new Thread(new Writer(data, lock,3000),"writer3");
Thread writer4 = new Thread(new Writer(data, lock,8000),"writer4");
Thread writer5 = new Thread(new Writer(data, lock,4000),"writer5");
Thread writer6 = new Thread(new Writer(data, lock,1000),"writer6");
Thread reader1 = new Thread(new Reader(data, lock,1000),"reader1");
Thread reader2 = new Thread(new Reader(data, lock,6000),"reader2");
Thread reader3 = new Thread(new Reader(data, lock,2000),"reader3");
Thread reader4 = new Thread(new Reader(data, lock,1000),"reader4");
Thread reader5 = new Thread(new Reader(data, lock,7000),"reader5");
Thread reader6 = new Thread(new Reader(data, lock,2000),"reader6");
writer1.start();
writer2.start();
writer3.start();
writer4.start();
writer5.start();
writer6.start();
reader1.start();
reader2.start();
reader3.start();
reader4.start();
reader5.start();
reader6.start();
}
}
class Writer implements Runnable {
ReadWriteLock lock;
List<Integer> data;
long millis;
public Writer(List<Integer> data, ReadWriteLock lock,long millis) {
this.data = data;
this.lock = lock;
this.millis = millis;
}
@Override
public void run() {
while (true) {
lock.writeLock();
System.out.println(Thread.currentThread().getName() + "开始添加数据");
Random random = new Random();
int number = random.nextInt(AntTest.numbers.length);
for (int i = 0; i < number; i++) {
data.add(AntTest.numbers[i]);
System.out.print(AntTest.numbers[i] + " ");
}
System.out.println(Thread.currentThread().getName() + "添加的数据结束 "
+ data);
lock.writeUnLock();
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Reader implements Runnable {
ReadWriteLock lock;
List<Integer> data;
long millis;
public Reader(List<Integer> data, ReadWriteLock lock,long millis) {
this.data = data;
this.lock = lock;
this.millis = millis;
}
@Override
public void run() {
while (true) {
lock.readLock();
System.out.println(Thread.currentThread().getName()+ "开始读取数据数据 " + data);
lock.readUnLock();
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}