4.2.1ReentrancReadWriteLock读写锁的使用

来源:互联网 发布:java工程师所属部门 编辑:程序博客网 时间:2024/06/11 16:05

ReentrantLock:完全互斥,同一时间只有一个线程在执行lock后面的程序,虽然保证了实例变量的安全,但是效果低下。

ReentrancReadWriteLock:提供读锁、写锁。读锁是共享锁,写锁是排他锁。多个读锁不互斥,读锁写锁互斥,写锁写锁互斥。可以提高程序的运行效率

一、读锁之间共享,不互斥

package demo;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * Created by sunyifeng on 17/10/19. */public class MyService {    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();    public void read() {        try {            try {                lock.readLock().lock();                System.out.println("获得读锁:" + Thread.currentThread().getName() + "当前时间:" + System.currentTimeMillis());                Thread.sleep(10000);            } finally {                lock.readLock().unlock();            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class ThreadA extends Thread {    private MyService myService;    public ThreadA(MyService myService) {        super();        this.myService = myService;    }    @Override    public void run() {        super.run();        myService.read();    }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class ThreadB extends Thread {    private MyService myService;    public ThreadB(MyService myService) {        super();        this.myService = myService;    }    @Override    public void run() {        super.run();        myService.read();    }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class Run {    public static void main(String[] args) {        MyService myService = new MyService();        ThreadA threadA = new ThreadA(myService);        threadA.setName("A");        ThreadB threadB = new ThreadB(myService);        threadB.setName("B");        threadA.start();        threadB.start();    }}
运行结果:

获得读锁:A当前时间:1508403425495
获得读锁:B当前时间:1508403425495

程序分析:

两个线程几乎同时进入lock()后面的代码(打印毫秒一样的),说明可以提高程序运行的效率。

原创粉丝点击