java多线程-ReadWriteReentrantLock
读写锁:读写互斥、写写互斥;是对synchronized、ReentranLock锁定一个细分,更确定的是对一个更加细的方向
ReadWriteReentrantLock
1、创建一个ReadWriteReentLock(默认情况是非公平锁)
ReadWriteLock readWriteLock = new ReadWriteReentrantLock();
2、获得读锁readLock()与释放锁
Lock readLock = readWriteLock.readLock();
readLock.lock();
readLock.unlock();
3、获得写锁writeLock()与释放锁
Lock writeLock = readWriteLock.writeLock();
writeLock.lock();
writeLock.unlock();
写线程与写线程是异步的
package java_lang_Object;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Created by luckyboy on 2018/7/9.
*/
public class ReentrantReadWriteLockTest {
public static void main(String[] args){
ThreadDomain4 threadDomain4 = new ThreadDomain4();
MyThread7_12 thread1 = new MyThread7_12(threadDomain4);
MyThread7_12 thread2 = new MyThread7_12(threadDomain4);
thread1.start();
thread2.start();
}
}
class ThreadDomain4{
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public void readA(){
try{
//获得读锁
readWriteLock.readLock().lock();
System.out.println(Thread.currentThread().getName()+" 进入了readA()");
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}finally{
//释放读锁
readWriteLock.readLock().unlock();
}
System.out.println(Thread.currentThread().getName()+" 休眠了2s后 退出了readA()");
}
}
class MyThread7_12 extends Thread{
private ThreadDomain4 threadDomain4;
public MyThread7_12(ThreadDomain4 threadDomain4){
this.threadDomain4 = threadDomain4;
}
@Override
public void run(){
threadDomain4.readA();
}
}
输出结果
Thread-0 进入了readA()
Thread-1 进入了readA()
Thread-0 休眠了2s后 退出了readA()
Thread-1 休眠了2s后 退出了readA()
读线程与写线程是同步的
package java_lang_Object;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Created by luckyboy on 2018/7/9.
*/
public class ReentrantReadWriteLockTest {
public static void main(String[] args){
ThreadDomain4 threadDomain4 = new ThreadDomain4();
MyThread7_12 thread1 = new MyThread7_12(threadDomain4);
MyThread7_13 thread3 = new MyThread7_13(threadDomain4);
thread1.start();
thread3.start();
}
}
class ThreadDomain4{
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public void readA(){
try{
readWriteLock.readLock().lock();
System.out.println(Thread.currentThread().getName()+" 进入了readA()");
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}finally{
readWriteLock.readLock().unlock();
}
System.out.println(Thread.currentThread().getName()+" 休眠了2s后 退出了readA()");
}
public void writeB(){
try{
readWriteLock.writeLock().lock();
System.out.println(Thread.currentThread().getName()+" 进入了writeB()");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+" 休眠了2s后 退出了writeB()");
}catch (InterruptedException e){
e.printStackTrace();
}finally{
readWriteLock.writeLock().unlock();
}
}
}
class MyThread7_12 extends Thread{
private ThreadDomain4 threadDomain4;
public MyThread7_12(ThreadDomain4 threadDomain4){
this.threadDomain4 = threadDomain4;
}
@Override
public void run(){
threadDomain4.readA();
}
}
class MyThread7_13 extends Thread{
private ThreadDomain4 threadDomain4;
public MyThread7_13(ThreadDomain4 threadDomain4){
this.threadDomain4 = threadDomain4;
}
@Override
public void run(){
threadDomain4.writeB();
}
}
输出结果
Thread-1 进入了writeB()
Thread-1 休眠了2s后 退出了writeB()
Thread-0 进入了readA()
Thread-0 休眠了2s后 退出了readA()
写线程与写线程是同步的
package java_lang_Object;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Created by luckyboy on 2018/7/9.
*/
public class ReentrantReadWriteLockTest {
public static void main(String[] args){
ThreadDomain4 threadDomain4 = new ThreadDomain4();
MyThread7_12 thread1 = new MyThread7_12(threadDomain4);
MyThread7_12 thread2 = new MyThread7_12(threadDomain4);
thread3.start();
thread4.start();
}
}
class ThreadDomain4{
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public void writeB(){
try{
readWriteLock.writeLock().lock();
System.out.println(Thread.currentThread().getName()+" 进入了writeB()");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+" 休眠了2s后 退出了writeB()");
}catch (InterruptedException e){
e.printStackTrace();
}finally{
readWriteLock.writeLock().unlock();
}
}
}
class MyThread7_13 extends Thread{
private ThreadDomain4 threadDomain4;
public MyThread7_13(ThreadDomain4 threadDomain4){
this.threadDomain4 = threadDomain4;
}
@Override
public void run(){
threadDomain4.writeB();
}
}
输出结果
Thread-0 进入了writeB()
Thread-0 休眠了2s后 退出了writeB()
Thread-1 进入了writeB()
Thread-1 休眠了2s后 退出了writeB()