
ReadWriteLock和ReentrantLock相比,在读多写少的场景下,性能有很多的提升
1、读读不互斥
2、读写互斥
3、写写互斥
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
package concurrent;
import java.util.Random; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
public class {
Lock lock = new ReentrantLock(); ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); Lock readLock = readWriteLock.readLock(); Lock writeLock = readWriteLock.writeLock(); int value = 0;
public int read(Lock lock) {
try { lock.lock(); Thread.sleep(1 * 1000); System.out.println("读到的值为 :" + value); return value; } catch (InterruptedException e) { e.printStackTrace(); return value; } finally { lock.unlock(); }
}
public void write(Lock lock, int value) {
try { lock.lock(); Thread.sleep(1 * 1000); this.value = value; System.out.println("写入的值为 :" + value); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); }
}
public static void main(String[] args) {
final ReadWriteLockDemo demo = new ReadWriteLockDemo();
Runnable readRun = new Runnable() {
public void run() {
Lock lock = demo.readLock; int value = demo.read(lock);
}
}; Runnable writeRun = new Runnable() {
public void run() {
Lock lock = demo.writeLock; demo.write(lock, new Random().nextInt());
}
}; for (int i = 0; i < 20; i++) { if (i > 1) { new Thread(readRun, "" + i).start(); } else { new Thread(writeRun, "" + i).start();
} }
}
}
|
近期评论