博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读写锁
阅读量:5908 次
发布时间:2019-06-19

本文共 3310 字,大约阅读时间需要 11 分钟。

import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class Data {	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    public  synchronized void  set(){		System.out.println(Thread.currentThread().hashCode() + "set:begin" + sdf.format(new Date()));	    try{	    	Thread.sleep(5000);	    }catch(Exception e){	    		    }finally{    		System.out.println(Thread.currentThread().hashCode() + "set:end" +sdf.format(new Date()));	    }	}		public synchronized void get(){		System.out.println(Thread.currentThread().hashCode() + "set:begin" + sdf.format(new Date()));	    try{	    	Thread.sleep(5000);	    }catch(Exception e){	    		    }finally{    		System.out.println(Thread.currentThread().hashCode() + "set:end" +sdf.format(new Date()));	    }	}}

  

public class Worker extends Thread {	Data data;	boolean read;	public Worker(Data data, boolean read) {		this.data = data;		this.read = read;	}	public void run() {		if (read)			data.get();		else			data.set();	}}

  

public class ReadWriteLockDemo {	public static void main(String args[]) {		Data data = new Data();		Worker thread1 = new Worker(data, true);		Worker thread2 = new Worker(data, true);		thread1.start();		thread2.start();	}}

  

上面的代码使用synchronized锁,用synchronized修饰的方法只能同时被一个线程访问,于是代码中两个线程要依次执行,结果如下

8637543set:begin2015-03-22 10:35:26

8637543set:end2015-03-22 10:35:31
22474382set:begin2015-03-22 10:35:31
22474382set:end2015-03-22 10:35:36

 

下面使用读写锁,只需要修改Data类就可以了

import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class Data {	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");	ReadWriteLock lock = new ReentrantReadWriteLock();	Lock read = lock.readLock();	Lock write = lock.writeLock();    public  void  set(){		write.lock();		System.out.println(Thread.currentThread().hashCode() + "set:begin" + sdf.format(new Date()));	    try{	    	Thread.sleep(5000);	    }catch(Exception e){	    		    }finally{    		System.out.println(Thread.currentThread().hashCode() + "set:end" +sdf.format(new Date()));    	    write.unlock();	    }	}		public void get(){
         read.lock() System.out.println(Thread.currentThread().hashCode() + "set:begin" + sdf.format(new Date())); try{ Thread.sleep(5000); }catch(Exception e){ }finally{ System.out.println(Thread.currentThread().hashCode() + "set:end" +sdf.format(new Date()));           read.unlock() } }}

同时读,结果

30771886set:begin2015-03-22 10:51:18

14718739set:begin2015-03-22 10:51:18
30771886set:end2015-03-22 10:51:23
14718739set:end2015-03-22 10:51:23

两个线程同时读取数据,同时执行结束,没有限制。

public class ReadWriteLockDemo {	public static void main(String args[]) {		Data data = new Data();		Worker thread1 = new Worker(data, false);		Worker thread2 = new Worker(data, true);		thread1.start();		thread2.start();	}}

  第一个线程写, 第二个线程读

8637543set:begin2015-03-22 10:54:11

8637543set:end2015-03-22 10:54:16
4699264set:begin2015-03-22 10:54:16
4699264set:end2015-03-22 10:54:21

 

读写锁允许同时读,但不允许读写同时进行

 

转载于:https://www.cnblogs.com/wuxinliulei/p/4356830.html

你可能感兴趣的文章
nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
查看>>
CentOS 7 搭建基于携程Apollo(阿波罗)配置中心单机模式
查看>>
PHP与Excel 笔记
查看>>
js使用正则表达式验证身份证格式
查看>>
捋一捋js面向对象的继承问题
查看>>
hbase分布式集群搭建
查看>>
ASP.NET Core 2.0 : 六. 举个例子来聊聊它的依赖注入
查看>>
桥接模式-pattern系列
查看>>
centos7环境安装ElasticSearch
查看>>
VidLoc: A Deep Spatio-Temporal Model for 6-DoF Video-Clip Relocalization
查看>>
SpringMVC RESTful风格URL处理带点的参数
查看>>
面试DB优化
查看>>
ORA-03137: TTC 协议内部错误: [12333] [4] [49] [51] [] [] [] []
查看>>
【laravel5.4】自定义404、503等页面
查看>>
如何的退出无响应的 SSH 连接
查看>>
Java对日期Date类进行加减运算,年份加减,月份加减
查看>>
使用Windows 2008R2中的NFS替代Samba协议,解决Windows 与Linux共享文件的问题
查看>>
深入理解Apache Flink核心技术
查看>>
SpringBoot系列: Json的序列化和反序列化
查看>>
移动端爬虫工具与方法介绍
查看>>