volatile关键字的应用场景主要是一写多读,因为volatile只能对多线程处理变量的可见性,并不能保证原子性,所以并发修改变量的时候还是要用synchronized加锁处理,例子
/*
* CMB Confidential
*
* Copyright (C) 2017 China Merchants Bank Co., Ltd. All rights reserved.
*
* No part of this file may be reproduced or transmitted in any form or by any means,
* electronic, mechanical, photocopying, recording, or otherwise, without prior
* written permission of China Merchants Bank Co., Ltd.
*/
package com.cmbchina.ccd.oa.cchrapi.juc;
/**
* @description: volatile关键字
* @author: kongwc
* @create: 2020-03-19
*/
public class VolatileDemo {
private static volatile int total = 10;
public static void main(String[] args) {
Ticket ticket = new Ticket();
Ticket1 ticket1 = new Ticket1();
Thread thread1 = new Thread(ticket1);
thread1.start();
for(int i=0; i<100; i++){
Thread thread = new Thread(ticket);
thread.start();
}
}
static class Ticket implements Runnable{
@Override
public void run() {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("total is:" + total + "--------时间为:" + System.currentTimeMillis());
}
}
static class Ticket1 implements Runnable{
@Override
public void run() {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
System.out.println("修改后打印时间为:" + System.currentTimeMillis() + "--------时间为:" + System.currentTimeMillis());
}
}
}
如果不加volatile关键字,对total做修改,并不能保证其他线程及时查询到修改后的变量