版权声明: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();
}
}