先看代码:


import java.util.concurrent.atomic.AtomicInteger;/**** @author xialuomantian*/
public class NewTest {static volatile int a = 1;static volatile int b = 1;//static  int a = 1;//static  int b = 1;public static AtomicInteger aa = new AtomicInteger(0);public static AtomicInteger bb = new AtomicInteger(0);public static AtomicInteger ab = new AtomicInteger(0);static void add() {a++;b++;}static synchronized void print() {if (a > b) {aa.getAndIncrement();           } else if (a < b) {bb.getAndIncrement();} if (a == b) {ab.getAndIncrement();}}public static void main(String[] args) {System.out.println(Thread.currentThread().getName());for (int i = 0; i < 100000; i++) {new Thread(() -> {               add();print();}).start();}System.out.println("a>b:" + aa);System.out.println("b>a:" + bb);System.out.println("a==b:" + ab);}
}

再去掉volatile

/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package com.mycompany.mytest;import java.util.concurrent.atomic.AtomicInteger;/**** @author xialuomantian*/
public class NewTest {static  int a = 1;static  int b = 1;public static AtomicInteger aa = new AtomicInteger(0);public static AtomicInteger bb = new AtomicInteger(0);public static AtomicInteger ab = new AtomicInteger(0);static void add() {a++;b++;}static synchronized void print() {if (a > b) {aa.getAndIncrement();           } else if (a < b) {bb.getAndIncrement();} if (a == b) {ab.getAndIncrement();}}public static void main(String[] args) {System.out.println(Thread.currentThread().getName());for (int i = 0; i < 100000; i++) {new Thread(() -> {               add();print();}).start();}System.out.println("a>b:" + aa);System.out.println("b>a:" + bb);System.out.println("a==b:" + ab);}
}

下面是几种结果:

你真的掌握了并发编程volatile synchronized么?相关推荐

  1. null在java存在的意义何在,Java并发编程——volatile关键字

    一.volatile是什么 volatile是Java并发编程中重要的一个关键字,被比喻为"轻量级的synchronized",与synchronized不同的是,volatile ...

  2. java 可见性_Java并发编程-volatile可见性详解

    前言 要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么 ...

  3. Java并发编程-Volatile和Syncronized关键字

    Java并发编程学习分享的目标 了解Java并发编程中常用的工具和类用途与用法 了解Java并发编程工具的实现原理与设计思路 了解并发编程中遇到的常见问题与解决方案 了解如何根据实际情景选择更合适的工 ...

  4. Java并发编程——volatile

    引 volatile可以看成是轻量级的低配版的Synchronized,他主要是作用于共享变量,保证共享变量的可见性.确保共享变量在主内存中一致地准确的更新通知到各个线程,这是Volatile的可见性 ...

  5. Java并发编程—volatile关键字(保证变量的可见性、有序性机制)

    原文作者:Matrix海子 原文地址:Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程 ...

  6. Java并发编程:volatile的使用

    1.CPU.主存及高速缓存的概念 计算机的硬件组成可以抽象为由总线.IO设备.主存.处理器(CPU)等组成.其中数据存放在主存中,CPU负责指令的执行,CPU的指令执行非常快,大部分简单指令的执行只需 ...

  7. 并发编程—Volatile关键字

    锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility).互斥即一次只允许一个线程持有某个特定的锁,因此可以保证一次就只有一个线程在访问共享数据.可见性要复杂一 ...

  8. Java并发编程--volatile关键字解析

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  9. Java并发编程 Volatile关键字解析

    volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...

最新文章

  1. TCP 和 UDP的理解
  2. 设计聊天机器人技术栈的终极攻略
  3. 微信小程序中用setData修改一个对象的属性值
  4. C语言变量初始化是必须的吗?不初始化会怎样?
  5. 经典正则表达式——常用的正则表达式
  6. 取重复记录最大的id列表
  7. [Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]
  8. centos7与centos6区别
  9. Sunny Day ijk英语
  10. 后端工程师的「跨域」之旅
  11. 微信端自动授权登陆实现 - 无第三方库版
  12. MFC建立C语言项目,mfc开发(mfc项目开发实例85个)
  13. Multisim使用入门教程
  14. 《球机3D定位解析及ONVIF实现》
  15. 好有成就感。。。又编了一个扫雷
  16. 无线网卡双机互联和双网卡共享上网
  17. 18位身份证的正则表达式并说明
  18. html链接路径分为哪几种,什么是url地址?
  19. [PHP]浅谈php混淆与反混淆
  20. Sony vegas 制作电子相册

热门文章

  1. html按钮线性炫光,6分钟实现CSS炫光倒影按钮 html+css
  2. python简单装饰器_简单介绍Python装饰器(一)
  3. php5.3.28安装,安装php-5.3.28 时问题
  4. 给模型加装饰器Java,装饰器设计模式
  5. 查询去除空值_SQL多表查询
  6. 鸟哥的linux私房菜内容,《鸟哥的linux私房菜》学习笔记 权限
  7. 网络模型:(0)背景
  8. PCL调错:(3)error C2589“(“:“::“右边的非法标记
  9. Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)
  10. GitHub:TensorFlow、PyTorch最全资料集锦