接Java Code之线程与同步(一)的例子,使用synchronized来挂锁。实际上这个锁的效率并不高,分析一下,如果门外排队的都是读数据的人,那么这些人是可以同时进入屋子里的,他们不会影响数据的配对。也就是说可以多个读数据操作同时进行,写数据操作只能同时有一个,并且在写数据时,不能读数据。
Java中就有一个这样的挂锁机制,看代码:
如之前的例子,只需修改FileManager.java
package com.iteye.badpie.javacode.thread.sync; import java.util.Random; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class FileManager { private Random mRandom; private String mName = "默认名字"; private String mEmail = "默认电子邮件"; private Lock mReadLock; private Lock mWriteLock; public FileManager() { mRandom = new Random(); // 构建读写锁 ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); mReadLock = rwLock.readLock(); mWriteLock = rwLock.writeLock(); } public void write(String id, String name, String email) { // 写锁 mWriteLock.lock(); mName = name; try { Thread.sleep(getRandomInt()); } catch (InterruptedException e) { e.printStackTrace(); } mEmail = email; System.out.println(String.format("写数据 id:%s, name:%s, email:%s", id, name, email)); // 解写锁 mWriteLock.unlock(); } public void read(String id) { // 读锁 mReadLock.lock(); try { Thread.sleep(getRandomInt()); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(String.format("读数据 id:%s, name:%s, email:%s", id, mName, mEmail)); // 解读锁 mReadLock.unlock(); } private int getRandomInt() { return mRandom.nextInt(2000); } }
再次运行,结果如下:
主线程开始运行 主线程运行结束 读数据 id:r, name:默认名字, email:默认电子邮件 写数据 id:w, name:0的名字, email:0的电子邮件 读数据 id:r, name:0的名字, email:0的电子邮件 写数据 id:w, name:1的名字, email:1的电子邮件 读数据 id:r, name:1的名字, email:1的电子邮件 写数据 id:w, name:2的名字, email:2的电子邮件 读数据 id:r, name:2的名字, email:2的电子邮件 写数据 id:w, name:3的名字, email:3的电子邮件 写数据 id:w, name:4的名字, email:4的电子邮件 读数据 id:r, name:4的名字, email:4的电子邮件
很明显,区分了读和写的锁,线程的调度更加均匀,效率更高了。
相关推荐
3.Using conditions in synchronized code; 4.Synchronizing a block of code with a Lock; 5.Synchronizing data access with read/write locks 6.Modifying Lock fairness 7.Using multiple conditions in a Lock
Java编程实现线程同步经典代码Java programming code for thread synchronization Classic
一个进程中的线程共享相同的内存单元/内存地址空间à可以访问相同的变量和对象,而且它们从同一堆中分配对象à通信、数据交换、同步操作 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制...
java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
其保障线程安全的手段是使用同步的包装所有函数,和其他线程安全的集合比起来,在多线程环境中效率很低。 ArrayDeque是基于循环拆分的双向数组,可扩容,拆分栈和样式。 平均情况下,作为栈比Stack效率更高,作为...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...
基于MVC的.java.web设计与开发.pdf │ 学习Struts提供的和Form相关标签.txt │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt)....
线程基础/同步sync/并发concurrent/容器/线程池 示例代码 JUC容器的源码解析 Synchronized 同步容器 Concurrent 并发容器: Map/List/Queue 阻塞队列 JUC锁: CountDownLatch 闭锁 AQS 锁的公共类 20180514 String, ...