本文共 2313 字,大约阅读时间需要 7 分钟。
先看代码:
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); }}
下面是几种结果:
转载地址:http://plrpf.baihongyu.com/