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:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...
随机推荐
- JSP脚本连接数据库
入门 简单的jsp文件 <%-- Created by IntelliJ IDEA. User: e550 Date: 2017/1/9 Time: 23:24 To change this t ...
- centos7 双网卡设置(先NAT和后桥接)
摘要:VMware中搭建一台虚拟机192.168.161.5(NAT转发) 首先在VM虚拟机设置里面添加一块网卡适配器 设置为桥接模式 完成后等待自动配置 此时出现多了一个ens37 和本地网段一样的 ...
- html&css基础笔记
有道笔记:http://note.youdao.com/noteshare?id=a6d7eab195085655bbfce86665524e35 一 HTML结构标签 HTML基本标签 标题标签 & ...
- Gym - 100203G Good elements 水+模拟
题意:good element的定义是a[i]在1~i-1中任取三个数(可以重复)的和能等于a[i] 思路:vis[x]标记一下任两个数的和,处理a[i]时枚举1~i-1判断vis[a[i] - a[ ...
- Container详解
Container是一个拥有绘制.定位.调整大小的widget. padding和margin padding和margin分别设置Container的内边距和外边距.可取值包括下面四个: EdgeI ...
- AOP 动态添加函数
Function.prototype.before = function(beforefn) { // 保存原函数的引用 var self = this; // 返回包含了原函数和新函数的代理函数 r ...
- IT运维分析
http://www.infoq.com/cn/presentations/case-of-it-operation-analysis-and-log-search-analysis-engine?u ...
- win10 WmiPrvSE.exe WMI Provider 占用CPU过高的问题
重启 Windows Management Instrumentation 服务 重启 WMI service. + ,输入: "services.msc" ,按 . 在 服务 ...
- 洛谷 P1964 【mc生存】卖东西
P1964 [mc生存]卖东西 题目背景 服务器好好玩 题目描述 lcy0x1去服务器的系统商店卖东西. 一个人的背包有21格. 一开始他的背包里有m件不同的物品(不能卖). 他要卖n种物品,每种物品 ...
- 11.2.0.1升级到11.2.0.4报错之中的一个:UtilSession failed: Patch 9413827
UtilSession failed: Patch 9413827 requires component(s) that are not installed in OracleHome. These ...