java 并发原子性与易变性 来自thinking in java4 21.3.3
java 并发原子性与易变性 具体介绍请參阅thinking in java4 21.3.3
thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155
package org.rui.thread.volatiles; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 假设你盲目地应用原子性慨念。那么就会看到在以下程序中的getValue符合上面的描写叙述
*
* 可是,该程序将找到奇数值并终止。虽然return i确实是原子性操作。可是缺少同步使得其数值能够在处于不稳定的中间状态时被读取。
* 除此之外,因为i也不是volatile的,因此还存在可视性问题
* @author lenovo
*
*/
public class AtomicityTest implements Runnable { private int i=0;
public int getValue(){return i;}
private synchronized void evenIncrement(){i++;i++;}
@Override
public void run() {
while(true)
evenIncrement(); } public static void main(String[] args) {
ExecutorService exec=Executors.newCachedThreadPool();
AtomicityTest at=new AtomicityTest();
exec.execute(at);
while(true)
{
int val=at.getValue();
if(val%2!=0)
{
System.out.println(val);
System.exit(0);
}
}
} }
package org.rui.thread.volatiles;
/**
* 考虑一些更简单的事情。一个产生序列数字的类,
* 每当nextSerial-Number被调用时,它必须向调用者返回唯一的值
* @author lenovo
*
*/
public class SerialNumberGenerator { private static volatile int serialNumber=0;
public static int nextSerialNumber()
{
return serialNumber++;//非线程安全
}
}
package org.rui.thread.volatiles; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 为了測试SerialNumberGenerator 我们须要不会耗尽内存的集(SET) 。
* 以防须要花费非常长的时间来探測问题。 这里所看到的的circularSet重用了存储int数值的内存,
* 并假设在你生成序列数时,产生数值覆盖冲突的可能性极小。add 和contains 方法都 是synchronized,以防示线程冲突
* @author lenovo
*
*/
//重用存储所以我们不耗尽内存
//reuses storage so we don't run out of memory
class CircularSet
{
private int[] array;
private int len;
private int index=0; public CircularSet(int size){
array=new int[size];
len=size;
//初始化一个值而不是生产
//这个初始全是-1和serialNumberGenerator 不同样。其后取serialNumberGenerator.next...存入
//by the serialNumberGenerator;
for(int i=0;i<size;i++)
array[i]=-1;
} //add
public synchronized void add(int i)
{
array[index]=i;
//wrap index and write over old elements; 将指数和写在旧元素;
index=++index % len;
//System.out.println(index+" : len :"+len); } //contains
public synchronized boolean contains(int val)
{
for(int i=0;i<len;i++)
{
System.out.println(array[i]+" == "+val);
if(array[i]==val)
return true; }
return false;
} }
///////////////////////////////////////////////
public class SerialNumberChecker {
private static final int SIZE=10;
private static CircularSet serials=new CircularSet(1000);
private static ExecutorService exec=Executors.newCachedThreadPool(); static class SerialChecker implements Runnable
{
@Override
public void run() {
while(true)
{
//自增长
int serial=SerialNumberGenerator.nextSerialNumber();
if(serials.contains(serial))
{
//反复
System.out.println("Duplicate: "+serial);
System.exit(0);
}
serials.add(serial);
}
}
} ////
public static void main(String[] args) throws NumberFormatException, InterruptedException {
String[] arg=new String[]{"10000"}; for(int i=0;i<SIZE;i++)
{
exec.execute(new SerialChecker());
//stop after n seconds if there 's an argument 停止在n秒后假设有一个论点
if(arg.length>0)
{
TimeUnit.SECONDS.sleep(new Integer(arg[0]));
System.out.println("没有反复检測");
System.exit(0);
}
}
}
} /**
* 通过创建多个任务来竞争序列数,你将发现这些任务终于会得到反复的序列数,假设你执行的时间足够长的话
* 为了解决问题,nextSerialNumber 前面加入 了synchronized关健字
*/
java 并发原子性与易变性 来自thinking in java4 21.3.3的更多相关文章
- Java并发编程(六)原子性与易变性
原子性 原子是最小单元.不可再分的意思.原子性是指某个操作在获取CPU时间时,要么就给它足够时间,让这个操作执行完,要么就不执行这个操作,执行时不能出现上下文切换(把CPU时间从一个线程分配到另一个线 ...
- Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)
JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...
- 【Java并发基础】加锁机制解决原子性问题
前言 原子性指一个或多个操作在CPU执行的过程不被中断的特性.前面提到原子性问题产生的源头是线程切换,而线程切换依赖于CPU中断.于是得出,禁用CPU中断就可以禁止线程切换从而解决原子性问题.但是这种 ...
- Java高并发--原子性可见性有序性
Java高并发--原子性可见性有序性 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 原子性:指一个操作不可中断,一个线程一旦开始,直到执行完成都不会被其他线程干扰.换 ...
- java并发特性:原子性、可见性、有序性
要想并发程序正确地执行,必须要保证原子性.可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 1.原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后 ...
- Java 并发编程(二):如何保证共享变量的原子性?
线程安全性是我们在进行 Java 并发编程的时候必须要先考虑清楚的一个问题.这个类在单线程环境下是没有问题的,那么我们就能确保它在多线程并发的情况下表现出正确的行为吗? 我这个人,在没有副业之前,一心 ...
- 【Java并发基础】并发编程bug源头:可见性、原子性和有序性
前言 CPU .内存.I/O设备之间的速度差距十分大,为了提高CPU的利用率并且平衡它们的速度差异.计算机体系结构.操作系统和编译程序都做出了改进: CPU增加了缓存,用于平衡和内存之间的速度差异. ...
- Java并发编程入门与高并发面试(三):线程安全性-原子性-CAS(CAS的ABA问题)
摘要:本文介绍线程的安全性,原子性,java.lang.Number包下的类与CAS操作,synchronized锁,和原子性操作各方法间的对比. 线程安全性 线程安全? 线程安全性? 原子性 Ato ...
- Java并发编程之验证volatile不能保证原子性
Java并发编程之验证volatile不能保证原子性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...
随机推荐
- Android Design Support Library(一)用TabLayout实现类似网易选项卡动态滑动效果
这里我们用TabLayout来实现这一效果.TabLayout是Android Design Support Library库中的控件.Google在2015的IO大会上,给我们带来了更加详细的Mat ...
- 16.C语言可变参数
//可变参数实现多个参数求和 1 #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> ...
- linux下chm阅读器
推荐使用Okular这个软件,Okular是一个pdf阅读器,但是对chm文件支持很好.
- scrapy框架设置代理
网易音乐在单ip请求下经常会遇到网页返回码503的情况经查询,503为单个ip请求流量超限,猜测是网易音乐的一种反扒方式因原音乐下载程序采用scrapy框架,所以需要在scrapy中通过代理的方式去解 ...
- 洛谷 P2558 [AHOI2002]网络传输
P2558 [AHOI2002]网络传输 题目描述 在计算机网络中所有数据都是以二进制形式来传输的. 但是在进行较大数据的传输时,直接使用该数的二进制形式加以传输则往往传输的位数过多. 譬如要传输 1 ...
- [Python] Reuse Code in Multiple Projects with Python Modules
A module is a function extracted to a file. This allows you to import the function and use it in any ...
- Python!Are you kidding me?
前几天由于python给我带来了兴奋写了一篇文章叫做<The beauty of python 1>,今天则是由于一个小错误而写下此文. 也是缘因为我的工作,问题是这种: 我有一个文档.里 ...
- Unityclient通信測试问题处理(一)
Unityclient通信測试问题处理(一) 近期在測试程序的通信模块时.遇到了一个问题:Unity的API函数仅仅能在主线程中调用.而作为client程序,我单独启用了一个监听线程来接收服务端发送的 ...
- HDU1788 Chinese remainder theorem again【中国剩余定理】
题目链接: pid=1788">http://acm.hdu.edu.cn/showproblem.php?pid=1788 题目大意: 题眼下边的描写叙述是多余的... 一个正整N除 ...
- 浅析.Net数据操作机制
举个栗子,获取新闻详情的案例. public ActionResult NewsView(int newsId) { var news = _newsService.GetNewsById(newsI ...