[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
随机推荐
- linux 下各errno的意义
strerror(errno):获取errno对应的错误 #include <string.h> /* for strerror */ #include <errno.h> # ...
- iOS平台基于ffmpeg的视频直播技术揭秘
现在非常流行直播,相信很多人都跟我一样十分好奇这个技术是如何实现的,正好最近在做一个ffmpeg的项目,发现这个工具很容易就可以做直播,下面来给大家分享下技术要点: 首先你得编译出ffmpeg运行所需 ...
- retrofit2 okhttp3 RxJava butterknife 示例
eclipse的jar包配置 eclipse中貌似用不了butterknife buildToolsVersion "23.0.2" defaultConfig { applica ...
- android EditText设置光标、边框和图标
控制边框形状,先在drawable中建一个xml文件:shape.xml <?xml version="1.0" encoding="utf-8"?> ...
- Struts2里如何取得request,session,application
第一种:取得MAP类型的request,session,application在java文件里写 package com.xjtu.st; import java.util.Map; import c ...
- 编译安装php时提示Cannot find MySQL header files的解决方法
php的配置文件中有一行--with-mysql=/usr/local/mysql ,安装的时候提示:configure: error: Cannot find MySQL header files ...
- Hibernate 性能优化之懒加载
针对数据库中的大数据,不希望特别早的加载到内存中,当用到它的时候才加载 懒加载分为:类的懒加载.集合的懒加载.单端关联的懒加载 类的懒加载 1.在默认情况下,类就是执行懒加载 2. ...
- Spring mvc 中有关 Shiro 1.2.3 配置问题
Spring 版本:3.2.x, 4.0.x [问题说明] 首先介绍下配置出错情况: (1)项目中,Spring3 and Spring4 的 applicationContext.xml aop ...
- The ultimate jQuery Plugin List(终极jQuery插件列表)
下面的文章可能出自一位奥地利的作者, 列出很多jQuery的插件.类似的网站:http://jquerylist.com/原文地址: http://www.kollermedia.at/archiv ...
- 动态加载下拉框列表并添加onclick事件
1. js动态加载元素并设置属性 摘自(http://www.liangshunet.com/ca/201408/336848696.htm) <div id="parent&quo ...