多线程学习笔记--08Lock的使用(ReentrantReadWriteLock)

版权声明:Mr.Wang 汪先生 https://blog.csdn.net/weixin_37650458/article/details/84979778

1.读写锁:ReentrantReadWriteLock类:

   ReentrantLock类虽然能够保证实例变量的安全,但是他的效率是非常低下的。所以提供读写锁来提供该方法的代码的运行速度。

   读写锁有两个锁:一个是读操作相关的锁,也称为共享锁,另一个是写操作相关的锁,也称为排他锁,也就是多个读锁之间不互斥,读锁和写锁互斥,写锁和写锁互斥。

2.读读共享锁:

package com.wx.threadlearn11;

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class MyService {
    private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
    public void read() {
        try {
            lock.readLock().lock();
            System.out.println(Thread.currentThread().getName()+" "+System.currentTimeMillis());
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.readLock().unlock();
        }
    }
}

 

package com.wx.threadlearn11;

public class ThreadA extends Thread {
    private MyService myService;
    public ThreadA(MyService myService){
        this.myService=myService;
    }
    @Override
    public void run() {
        myService.read();
    }
}
package com.wx.threadlearn11;

public class Test1 {
    public static void main(String[] args){
        MyService myService=new MyService();
        ThreadA threadA=new ThreadA(myService);
        threadA.start();
        ThreadA threadA1=new ThreadA(myService);
        threadA1.start();
    }
}

 

3.写写互斥锁:

package com.wx.threadlearn12;

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class MyService  {
    private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
    public void write() {
        try {
            lock.writeLock().lock();
            System.out.println(Thread.currentThread().getName()+" "+System.currentTimeMillis());
            Thread.sleep(3000);
        }catch (Exception e)
        {
            e.printStackTrace();
        }finally {
            lock.writeLock().unlock();
        }
    }
}
package com.wx.threadlearn12;

public class ThreadA extends Thread {
    private MyService myService;
    public ThreadA(MyService myService) {
        this.myService=myService;
    }
    @Override
    public void run() {
        myService.write();
    }
}

 测试:

package com.wx.threadlearn12;

public class Test1 {
    public static void main(String[] args){
        MyService myService=new MyService();
        ThreadA threadA=new ThreadA(myService);
        ThreadA threadA1=new ThreadA(myService);
        threadA.start();
        threadA1.start();
    }
}

 

4.读写互斥锁(写读互斥锁):

package com.wx.threadlearn13;

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class MyService {
    private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
    public void reda(){
        try {
            lock.readLock().lock();
            System.out.println(Thread.currentThread().getName()+" "+System.currentTimeMillis());
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.readLock().unlock();
        }
    }
    public void write(){
        try{
            lock.writeLock().lock();
            System.out.println(Thread.currentThread().getName()+" "+System.currentTimeMillis());
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.writeLock().unlock();
        }
    }
}
package com.wx.threadlearn13;

public class ThreadRead extends Thread {
    private MyService myService;
    public ThreadRead(MyService myService){
        this.myService=myService;
    }
    @Override
    public void run() {
        myService.reda();
    }
}
package com.wx.threadlearn13;

public class ThreadWrite extends Thread {
    private MyService myService;
    public ThreadWrite(MyService myService){
        this.myService=myService;
    }
    @Override
    public void run() {
        myService.write();
    }
}

测试:

package com.wx.threadlearn13;

public class Test1 {
    public static void main(String[] args){
        MyService myService=new MyService();
        ThreadRead threadRead=new ThreadRead(myService);
        threadRead.start();
        ThreadWrite threadWrite=new ThreadWrite(myService);
        threadWrite.start();
    }
}

 

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/84979778