您的位置:首页 > 编程语言

你真的掌握了并发编程volatile synchronized么?

2020-02-02 06:52 477 查看

先看代码:

[code]
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

[code]/*
* 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);
}
}

下面是几种结果:

  • 点赞
  • 收藏
  • 分享
  • 文章举报
21aspnet 博客专家 发布了1595 篇原创文章 · 获赞 1163 · 访问量 1224万+ 他的留言板 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: