Java使用volatile实现多线程输出ABC共10次
问题
有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C。要求,同时启动三个线程, 按顺序输出ABC, 循环10次。
今天在写多线程的时候找例子,见到了这样一个题,觉得不难,但是在网上没有看见用volatile实现的,于是自己写一下记录下来。
代码
public class Main {
public static void main(String[] args) throws InterruptedException {
// write your code here
for (int i = 0; i < Test.ARRAY.length; i++) {
new Test.OutputThread(i).start();
}
}
}
class Test {
public static final String[] ARRAY = {"A", "B", "C"};
private static volatile int index = 0;
private static volatile int count = 0;
static class OutputThread extends Thread {
int num;
OutputThread(final int num) {
this.num = num;
}
@Override
public void run() {
while (count < 10) { //更改输出ABC的次数
if (index != num) {
continue;
}
System.out.print(ARRAY[index]);
count += (index + 1) / ARRAY.length; //这里可以换成if判断后+1
index = (index + 1) % ARRAY.length;
}
}
}
}
Java使用volatile实现多线程输出ABC共10次的更多相关文章
- Java多线程系列目录(共43篇)(转)
Java多线程系列目录(共43篇) http://www.cnblogs.com/skywang12345/p/java_threads_category.html
- Java基础教程:多线程杂谈——双重检查锁与Volatile
Java基础教程:多线程杂谈——双重检查锁与Volatile 双重检查锁 有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化.此时程序员可能会采用延迟初始化.但要正确实 ...
- Java多线程系列目录(共43篇)
最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...
- Java多线程系列--“JUC集合”10之 ConcurrentLinkedQueue
概要 本章对Java.util.concurrent包中的ConcurrentHashMap类进行详细的介绍.内容包括:ConcurrentLinkedQueue介绍ConcurrentLinkedQ ...
- Java中Volatile关键字详解
一.基本概念 先补充一下概念:Java并发中的可见性与原子性 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值, ...
- Java中Volatile的作用
Java中Volatile的作用 看了几篇博客,发现没搞懂.可是简单来说,就是在我们的多线程开发中.我们用Volatile关键字来限定某个变量或者属性时,线程在每次使用变量的时候.都会读取变量改动后的 ...
- java中volatile关键字的理解
一.基本概念 Java 内存模型中的可见性.原子性和有序性.可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有 ...
- java 并发——volatile
java 并发--volatile 介绍 维基百科: volatile 是一个类型修饰符(type specifier).volatile 的作用是确保本条指令不会因编译器的优化而省略,且要求每次直接 ...
- Java中Volatile关键字详解(转载)
转载自:https://www.cnblogs.com/zhengbin/p/5654805.html 一.基本概念 先补充一下概念:Java 内存模型中的可见性.原子性和有序性. 可见性: 可见性是 ...
随机推荐
- Python3练习
Hello Python3 print("Hello Python!") #print("Hello, Python!"); '''a=1 b=2 c=a+b ...
- C语言中你可能不熟悉的头文件(stdlib.h)
C语言中你可能不熟悉的头文件<cstdlib>(stdlib.h) C Standard General Utilities Library (header) C标准通用工具库(头文件) ...
- arrays.xml中使用integer-array引用drawable图片资源,代码中如何将这些图片资源赋值到ImageView控件中
当我们在arrays.xml文件中声明一些图片资源数组的时候: <?xml version="1.0" encoding="utf-8"?> < ...
- Connection open error . Connection Timeout Expired. The timeout period elapsed during the post-login phase.
是这样的,最近我在开发Api(重构),用的数据库是Sqlserver,使用的Orm是 SqlSugar(别问我为什么选这个,boss选的同时我也想支持国人写的东西,且文档也很全). 被催的是,写好了程 ...
- 在C#中使用忽略大小写的string.Contains方法
在C#中比较源字符串是否包含目标字符串,我们可以使用以下方法: source.Contains(target) source.IndexOf(target) >= 0; 相对而言 Contain ...
- Spring Boot 路由
多路由指向同一个方法 @GetMapping(value = {"/login","/index"}) 访问http://127.0.0.1/index 和 h ...
- leetcode — palindrome-partitioning-ii
import java.util.Arrays; /** * * Source : https://oj.leetcode.com/problems/palindrome-partitioning-i ...
- 使用 curl 进行 ssl 认证
目录 SSL 认证 认证实现 问题解决 curl不支持 https SSL certificate problem, verify that the CA cert is OK curl: (60) ...
- [四]基础数据概述之Byte详解
Byte 基本数据类型byte 的包装类 Byte 类型的对象包含一个 byte类型的字段 属性简介 构造方法 Byte的构造方法也是有两种 可以通过基本类型byt ...
- [十七]基础类型BigDecimal简介
BigDecimal是不可变的.任意精度的.有符号的.十进制数. 组成部分 BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成 BigDecimal ...