[Java Concurrent] 并发访问共享资源的简单案例
EvenGenerator 是一个偶数生成器,每调用一个 next() 就会加 2 并返回叠加后结果。在本案例中,充当被共享的资源。
EvenChecker 实现了 Runnable 接口,可以启动新的线程执行 run() 任务,用于检测所指向的偶数生成器是否每次都返回偶数值。
EvenCheckerThreadDemo 用于演示多线程下的执行情况。
非线性安全版本
EvenGenerator, 偶数生成器,每调用一个 next() 就会加 2 并返回叠加后结果。
这里的 next() 方法并非线性安全,在多线程同时访问时,可能会返回奇数。一个线程执行了第一个累加语句后,被调度器中断,替换上下文,另一个进程开始执行 next() 方法,则会返回奇数。
public class EvenGenerator {
private int count = 0;
public int next(){
count++;
count++;
return count;
}
}
EvenChecker 检测指向的 EvenGenerator 是不是每次都返回偶数。
public class EvenChecker implements Runnable {
private EvenGenerator eg;
private final int id = count++;
private static int count = 0;
@Override
public void run() {
while (true){
int res = eg.next();
if (res % 2 != 0){
System.out.println("not even" + res + " | Thread # " + id);
break;
}
}
}
public EvenChecker(EvenGenerator eg){
this.eg = eg;
}
}
演示多线程下的执行情况,多个线程同时执行 EvenChecker ,但是引用的是同一个 EvenGenerator
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class EvenCheckerThreadDemo { public static void main(){
ExecutorService exec = Executors.newCachedThreadPool(); EvenGenerator eg = new EvenGenerator(); for (int i = 0; i< 5 ; i++){
exec.execute(new EvenChecker(eg));
}
}
}
线性安全版本1
使用 synchronized 关键词,使得 next() 方法线程安全,确保同一时间内,最多只有一个线程进入该方法。
public class EvenGenerator {
private int count = 0;
public synchronized int next(){
count++;
count++;
return count;
}
}
线性安全版本2
使用 Lock 把访问、修改共享变量的语句进行同步,确保同一时间内,最多只有一个线程进入该块代码。使用 try-finally 结构,可以确保 Lock 一定被释放。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class EvenGenerator { private int count = 0; private Lock lock = new ReentrantLock(); public int next(){
lock.lock();
try {
count++;
count++;
return count;
} finally{
lock.unlock();
}
}
}
参考资料
Page 827, Resolving shared resource contention, Thinking in Java
[Java Concurrent] 并发访问共享资源的简单案例的更多相关文章
- 多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore
“线程同步”的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thread synchro ...
- java concurrent 并发多线程
Concurrent 包结构 ■ Concurrent 包整体类图 ■ Concurrent包实现机制 综述: 在整个并发包设计上,Doug Lea大师采用了3.1 Concurrent包整体架构的三 ...
- java Concurrent并发容器类 小结
Java1.5提供了多种并发容器类来改进同步容器的性能. 同步容器将所有对容器的访问都串行化,以实现他们的线程安全性.这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重减低. 一 ...
- java基础之多线程四:简单案例
多线程案例: 有一个包包的数量为100个,分别从实体店和官网进行售卖.使用多线程的方式,分别打印实体店和官网卖出包包的信息.分别统计官网和实体店各卖出了多少个包包 第一种方法 继承Thread类: p ...
- java concurrent 中ExecutorService和CompletionService简单区别
举个例子,现在需要执行10个任务,这些任务都是有返回值,并且需要使用10个线程同时执行.一般的做法就是创建ExecutorService线程池,pool大小10,每个任务实现Callable接口,然后 ...
- Java精通并发-wait与notify方法案例剖析与详解
在上一节中对Object的wait.notify.notifyAll方法进行了总结,这次举一个具体案例来进行巩固,题目如下: 编写一个多线程程序,实现这样的一个目标: 1.存在一个对象,该对象有一个i ...
- java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能
这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能 ...
- java多线程(五)-访问共享资源以及加锁机制(synchronized,lock,voliate)
对于单线程的顺序编程而言,每次只做一件事情,其享有的资源不会产生什么冲突,但是对于多线程编程,这就是一个重要问题了,比如打印机的打印工作,如果两个线程都同时进行打印工作,那这就会产生混乱了.再比如说, ...
- OAF_开发系列27_实现OAF中Java类型并发程式开发调用XML Publisher(案例)
20150814 Created By BaoXinjian
随机推荐
- redis 记录
参考 : http://keenwon.com/1275.html http://blog.csdn.net/freebird_lb/article/details/7733970 http://w ...
- jquery ajax 提交表单(file && input)
用到的插件 jquery.js jquery.form.js[http://malsup.github.io/jquery.form.js] 提交页面 <form enctype="m ...
- yii 验证码那点事儿
今天要使用yii验证码, 不过, 这个验证码是整站通用的, 也就是说, 有个表单的提交是使用ajax方式来提交, 整站, 不管在哪个地方, 都能点出来此窗口, 来提交信息 关于yii验证码, fram ...
- java定时器,Spring定时器和Quartz定时器
一.java定时器的应用 其实java很早就有解决定时器任务的方法了,java提供了了类java.util.TimerTask类基于线程的方式来实现定时任务的操作,然后再提供java.util.Tim ...
- display:box和flex的区别
没区别,仅是各阶段草案命名flex是最新的 但是在实际的浏览器测试中,display: flex 不能完全替代display: -webkit-box display: box 使用可以参考http: ...
- win7 打开方式不能添加程序
打开注册表,找到“HKEY_CLASSES_ROOT\Applications\”中,查看相应的程序的“\shell\open\command”项中的数据是否正确:如果不正确,就修改正确,之后再添加程 ...
- .Net操作XML文件
//设置配置文件物理路径 public string xmlPath = "/manage/spider/config.xml"; protected void Page_Load ...
- 关于IO学习的几个函数
这是最近学到的几个关于IO文件操作的几个小算法,今天总结出来. 1. 删除一个给定的目录,这上目录不为空目录,使用递归来实现 public void test04(File file) { File[ ...
- 集成支付宝后出现LaunchServices: ERROR: There is no registered handler for URL scheme alipay
原因如下: There's no problem with your implementation. All those warnings mean is the apps which each UR ...
- ubuntu下安装Vmare Workstation,并安装mac补丁
最近想学习一下关于ios方面的开发,但是苦于自己的电脑已经装了两个系统:一个win7,一个ubuntu.两系统均装在物理硬盘上,不想格盘,所以装个虚拟机玩玩.决定使用Vmare Workstation ...