java多线程-ReedWriteReentrantLock

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

ReentranLock与synchronized的区别(留下后面总结)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值