Java线程安全 关于原子性与volatile的试验
1. 变量递增试验
1 static /*volatile*/ int shared=0;//volatile也无法保证++操作的原子性 2 static synchronized int incrShared(){//不加synchronized的话,shared最终结果值小于预期 3 return ++shared; 4 } 5 public static void testIncrShared(String[] args) throws InterruptedException { 6 shared=0; 7 Thread[] thrds = new Thread[20]; 8 for(int j=0;j<thrds.length;j++){ 9 thrds[j] = new Thread(new Runnable() { 10 @Override 11 public void run() { 12 for(int k=0;k<1000;k++){ 13 System.out.println(incrShared()); 14 } 15 } 16 }); 17 } 18 for(int j=0;j<thrds.length;j++){ 19 thrds[j].start(); 20 } 21 for(int j=0;j<thrds.length;j++){ 22 thrds[j].join(); 23 } 24 System.out.println(shared); 25 }
2. volatile试验
1 static /*volatile*/ int a0,a1;//这里加volatile的话,可以避免r0==r1==0的结果 2 static /*volatile*/ int r0,r1;//这里即使加volatile,也无法避免r0==r1==0的结果 3 public static void testVolatile(String[] args) throws InterruptedException { 4 int[] a=new int[2]; 5 int[] r=new int[2]; 6 final int SLEEP=10; 7 final Object lock=new Object(); 8 Runnable run1=new Runnable() { 9 @Override 10 public void run() { 11 try { 12 Thread.sleep(SLEEP); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 //synchronized (lock) {//加锁也可以建立happens-before关系,避免r0==r1==0的结果 17 a0=1; 18 //} 19 r1=a1; 20 } 21 }; 22 Runnable run2=new Runnable() { 23 @Override 24 public void run() { 25 try { 26 Thread.sleep(SLEEP); 27 } catch (InterruptedException e) { 28 e.printStackTrace(); 29 } 30 //synchronized (lock) {31 a1=1; 32 //} 33 r0=a0; 34 } 35 }; 36 Thread thrd1; 37 Thread thrd2; 38 39 int i; 40 int[][] acnt=new int[2][2]; 41 int[][] rcnt=new int[2][2]; 42 for(i=0;i<10000;i++){ 43 a0=a1=0; 44 r0=r1=0; 45 thrd1 = new Thread(run1); 46 thrd2 = new Thread(run2); 47 48 thrd1.start(); 49 thrd2.start(); 50 51 thrd1.join(); 52 thrd2.join(); 53 54 a[0]=a0; 55 a[1]=a1; 56 r[0]=r0; 57 r[1]=r1; 58 System.out.println(i); 59 System.out.println(Arrays.toString(a)); 60 System.out.println(Arrays.toString(r)); 61 acnt[a[0]][a[1]]++; 62 rcnt[r[0]][r[1]]++; 63 } 64 System.out.println(Arrays.deepToString(acnt)); 65 System.out.println(Arrays.deepToString(rcnt)); 66 }
3. volatile试验2
1 static boolean shouldStop=false; 2 public static void testVolatile2(String[] args) throws InterruptedException { 3 shouldStop=false; 4 Runnable run1=new Runnable() { 5 @Override 6 public void run() { 7 int i=0; 8 while (!shouldStop) {//无法读取到线程2修改后的shouldStop值,导致无限循环 9 i++; 10 //System.out.println(i);//如果调用其他函数的话,就又可以读取到shouldStop的最新值了 11 } 12 } 13 }; 14 Runnable run2=new Runnable() { 15 @Override 16 public void run() { 17 try { 18 Thread.sleep(10); 19 } catch (InterruptedException e) { 20 e.printStackTrace(); 21 } 22 shouldStop=true; 23 } 24 }; 25 Thread thrd1; 26 Thread thrd2; 27 28 int i; 29 int[][] acnt=new int[2][2]; 30 int[][] rcnt=new int[2][2]; 31 for(i=0;i<100;i++){ 32 thrd1 = new Thread(run1); 33 thrd2 = new Thread(run2); 34 35 thrd1.start(); 36 thrd2.start(); 37 38 thrd2.join(); 39 System.out.println(i); 40 System.out.println(shouldStop); 41 thrd1.join(); 42 43 } 44 }
转载于:https://www.cnblogs.com/SonicU/p/6852888.html
Java线程安全 关于原子性与volatile的试验相关推荐
- java(线程特性,Volatile作用,java内存模型)
1.java线程特性 1.原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行 银行转账,自己转100给别人,自己账户少100 别人多100 不会出现,自己 ...
- java 线程安全原子性_Java 线程安全之原子性
Java 线程安全之原子性 Java 线程安全之原子性 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可被打乱,也不可以被切割而执行其中的一部分(不可中断).将整个操作视为一个整体是原子性 ...
- java 线程 原子性_深入理解Java多线程与并发框架——Java内存模型与原子性、可见性、有序性...
欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享!Java架构筑基zhuanlan.zhihu.comJava架构筑基--专注于Java技术的研究与分享! 后续文章将首 ...
- 重点知识学习(8.2)--[JMM(Java内存模型),并发编程的可见性\原子性\有序性,volatile 关键字,保持原子性,CAS思想]
文章目录 1.JMM(Java Memory Model) 2.并发编程的可见性 3.并发编程的有序性 4.并发编程的原子性 5.volatile 关键字 6.保持原子性: 加锁,JUC原子类 加锁 ...
- Java并发知识梳理(上):并发优缺点,线程状态转换,Java内存模型,Synchronized,Volatile,final,并发三特性,Lock与AQS,ReetrandLock
努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! 整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到.所以在学习过程中,记 ...
- Java线程详解(10)-volatile关键字
Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volatile 变量所需的编码较少,并 ...
- Java线程(二):线程同步synchronized和volatile
上篇通 过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么 会产生这样的结果呢,因为建立的Count对象是 ...
- volatile关键字和Java线程安全问题
一.java中的线程安全问题 我们都知道,Java是一种夸平台的语言,因此Java这种语言在处理线程安全问题的时候,会有自己的处理机制,例如volatile关键字,synchronized关键字,并且 ...
- 【java线程】锁机制:synchronized、Lock、Condition
[Java线程]锁机制:synchronized.Lock.Condition 原创 2013年08月14日 17:15:55 标签:Java /多线程 74967 http://www.infoq. ...
最新文章
- YTU 1495 蛇行矩阵 YTU 1607 字符棱形YTU 1959 图案打印YTU 2016 打印金字塔
- Matlab绘图基础——利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴)
- 类与类集合的基本使用
- 机器人 蓝buff 钩_lol:机器人史诗级加强,从河道钩蓝buff,对面打野要骂人
- 【渝粤教育】电大中专幼儿园课程论 (1)作业 题库
- 用计算机求函数公式,计算机常用的函数公式有哪些?
- 调用newtonsoft.json反序列出错
- u-boot移植随笔:u-boot启动流程简图
- 反射实现方法调用(1):执行机制
- jsp include指令标签
- skills --札记
- Python验证码识别处理实例
- cad字体安装_CAD字体大全下载【软件下载】
- Slic3r基础知识
- linux alsa 音量参数
- 检验银行卡卡号是否合法有效
- 【多目标优化求解】基于matlab非支配排序灰狼优化(NS-GWO)算法求解多目标优化问题【含Matlab源码 2015期】
- 堡垒机是什么,堡垒机的作用在哪里
- win rar如何注册破解
- 你了解世界上功能最强大的开源数据库吗?
热门文章
- CV00-02-CV基本操作1
- 桌面应用程序 azure_Azure Logic应用程序用例–黑色星期五
- 考csp所需算法_CSP vs RxJS:您所不知道的。
- prolog_如何通过观看权力的游戏学习Prolog
- 微博polg什么意思_贾磊:广东发微博给CBA造成了负面影响 方硕的意思可能没表达清楚...
- linux mpp集群环境,Linux环境下,DM8-MPP两节点集群搭建
- php instr函数,oracle的instr函数用法
- 现在参加软件测试培训就业难度大不大?
- java培训:什么是抽象类?怎么定义?
- python邮件发送哪个好_最全总结!聊聊 Python 发送邮件的几种方式