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 studio 导入PullToRefresh
1.新建一个Android项目,下载好Android-PullToRefresh-master,并解压,找到library文件夹,我把他放在C:\import目录下,下面的都是根据箭头一步一步的点击即 ...
- FreeBSD是UNIX系统的重要分支,其命令与Linux大部分通用,少部分是其特有。
FreeBSD是UNIX系统的重要分支,其命令与Linux大部分通用,少部分是其特有. 1: man 在线查询 man ls2: ls 查看目录与档案 ls -la3: ln 建立链接文件 ln -f ...
- 参考《机器学习实战》高清中文PDF+高清英文PDF+源代码
机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存.谋发展的决定性手段,这使得这一过去为分析师和数学家所专属的研究领域 ...
- 洛谷 P1360 [USACO07MAR]黄金阵容均衡Gold Balanced L…
P1360 [USACO07MAR]黄金阵容均衡Gold Balanced L… 题目描述 Farmer John's N cows (1 ≤ N ≤ 100,000) share many simi ...
- android SIM Switch功能和配置
SIM Switch feature是Smart 3G switch feature在LTE版本号上发展演变而来的功能: MTK双卡双待单通版本号仅仅有一个3/4 G Protocol.所以同一时刻仅 ...
- 使用Gmail邮箱
由于国内不能直接访问google,所以其相关产品也不能直接使用.因为Gmail简洁,使用方便,国际上用的人很多.最近发现网易邮箱大师可以直接访问Gmail,所以将方法介绍给大家,如果大家只有访问Gma ...
- Spring MVC原理及实例基础扫盲篇
近期 项目中刚接触了SpringMVC,就把这几天看的跟实践的东西写出来吧. 一.首先,先来了解一下SpringMVC究竟是个什么样的框架? Spring Web MVC是一种基于Java的实现了We ...
- OpenCV —— 矩阵和图像操作
cvAbs , cvAbsDiff , cvAbsDiffS cvAdd , cvAddS , cvAddWeighted(可添加权重) #include <cv.h> #include ...
- Linux 时区的修改
Linux 时区的修改 1. CentOS和Ubuntu的时区文件是/etc/localtime,但是在CentOS7以后localtime以及变成了一个链接文件 ``` [root@centos7 ...
- zookeeper提供了什么
简单的说,zookeeper=文件系统+通知机制. 每个子目录项如 NameService 都被称作为 znode,和文件系统一样,我们能够自由的增加.删除znode,在一个znode下增加.删除子z ...