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的更多相关文章

  1. Java并发编程(六)原子性与易变性

    原子性 原子是最小单元.不可再分的意思.原子性是指某个操作在获取CPU时间时,要么就给它足够时间,让这个操作执行完,要么就不执行这个操作,执行时不能出现上下文切换(把CPU时间从一个线程分配到另一个线 ...

  2. Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  3. 【Java并发基础】加锁机制解决原子性问题

    前言 原子性指一个或多个操作在CPU执行的过程不被中断的特性.前面提到原子性问题产生的源头是线程切换,而线程切换依赖于CPU中断.于是得出,禁用CPU中断就可以禁止线程切换从而解决原子性问题.但是这种 ...

  4. Java高并发--原子性可见性有序性

    Java高并发--原子性可见性有序性 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 原子性:指一个操作不可中断,一个线程一旦开始,直到执行完成都不会被其他线程干扰.换 ...

  5. java并发特性:原子性、可见性、有序性

    要想并发程序正确地执行,必须要保证原子性.可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 1.原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后 ...

  6. Java 并发编程(二):如何保证共享变量的原子性?

    线程安全性是我们在进行 Java 并发编程的时候必须要先考虑清楚的一个问题.这个类在单线程环境下是没有问题的,那么我们就能确保它在多线程并发的情况下表现出正确的行为吗? 我这个人,在没有副业之前,一心 ...

  7. 【Java并发基础】并发编程bug源头:可见性、原子性和有序性

    前言 CPU .内存.I/O设备之间的速度差距十分大,为了提高CPU的利用率并且平衡它们的速度差异.计算机体系结构.操作系统和编译程序都做出了改进: CPU增加了缓存,用于平衡和内存之间的速度差异. ...

  8. Java并发编程入门与高并发面试(三):线程安全性-原子性-CAS(CAS的ABA问题)

    摘要:本文介绍线程的安全性,原子性,java.lang.Number包下的类与CAS操作,synchronized锁,和原子性操作各方法间的对比. 线程安全性 线程安全? 线程安全性? 原子性 Ato ...

  9. Java并发编程之验证volatile不能保证原子性

    Java并发编程之验证volatile不能保证原子性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...

随机推荐

  1. DELL T110 II 系统安装总结

    DELL T110 II  系统安装总结 1.RAID制作:https://jingyan.baidu.com/article/a3aad71ac4ce98b1fb0096bc.html 2.系统安装 ...

  2. 判断控件的CGRect是否重合,获取控件的最大XY值

    判断给定的点是否被一个CGRect包含: BOOL contains = CGRectContainsPoint(CGRect rect, CGPoint point); 判断一个CGRect是否和另 ...

  3. 【Codeforces Round #459 (Div. 2) A】Eleven

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这个数列增长很快的. 直接暴力模拟看看是不是它的一项就好了 [代码] #include <bits/stdc++.h> ...

  4. Linux下经常使用的C/C++开源Socket库

    1.      Linux Socket Programming In C++ : http://tldp.org/LDP/LG/issue74/tougher.html 2.      ACE: h ...

  5. .Net接口调试与案例

    1.通过查看日志,可以看出问题的原因. 2.断点调试. 3.本地测试,确保无误后,线上测试. 4.输出测试. 通过get的方式,测试接口. // [HttpPost] public ActionRes ...

  6. 智课雅思词汇---二、词根acu和acr

    智课雅思词汇---二.词根acu和acr 一.总结 一句话总结:acu和acr:sharp锋利的,敏捷的: acuteacutelyacuity sharp锋利的,敏捷的 1.词根acr表示什么意思? ...

  7. vue 打包成 apk 文件(修改路径)

    第一个坑:文件引用路径 现在项目我们什么都没动,是初始化之后直接打包的状态,打开dist/index.htmnl文件整个网页都是一片空白的. 爬坑: 打开 config文件夹/index.js文件 a ...

  8. HDU 4704 Sum 超大数幂取模

    很容易得出答案就是2^(n-1) 但是N暴大,所以不可以直接用幂取模,因为除法操作至少O(len)了,总时间会达到O(len*log(N)) 显然爆的一塌糊涂 套用FZU1759的模板+顺手写一个大数 ...

  9. jq实现回车键执行方法

    $(function(){ $(document).keypress(function (e){ if(e.keyCode == 13){ //执行你想执行的方法,keyCode代表不同的按键 } } ...

  10. visualSVN+花生壳实现外网访问局域网内SVN

    使用SubVersion+TortoiseSVN局域网内访问SVN成功后,想从外网访问SVN,使用花生壳绑定路由器动态DNS,但是折腾半天没搞定,突然发现一个帖子http://hi.baidu.com ...