读写锁

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

}

}

}

}

 

 

 

 

 

你可能感兴趣的:(读写锁)