多线程使用for循环遍历同一个Set,是否线程安全?
Posted Java高级交流
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程使用for循环遍历同一个Set,是否线程安全?相关的知识,希望对你有一定的参考价值。
情景:
有一个线程外部的set集合(值保持不变),有多个线程同时遍历它,要求每个线程使用for循环的方式,且要可以遍历到set的全部值。
验证代码:
package com.vhs.ma;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class ThreadTest {
public final static Set<Integer> nums = new HashSet();
public static int count = 0;
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
nums.add(i);
}
for (int i = 0; i < 10; i++) {
new SetThread().start();
}
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count > 9)
break;
}
}
}
class SetThread extends Thread {
@Override
public void run() {
for (Integer s : ThreadTest.nums) {
try {
Thread.sleep(1000 * new Random().nextInt(5));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "====" + s);
}
ThreadTest.count++;
}
}
输出:
Thread[Thread-8,5,main]====0
Thread[Thread-5,5,main]====0
Thread[Thread-4,5,main]====0
Thread[Thread-8,5,main]====1
Thread[Thread-8,5,main]====2
Thread[Thread-1,5,main]====0
Thread[Thread-6,5,main]====0
Thread[Thread-3,5,main]====0
Thread……
Thread[Thread-2,5,main]====9
结论:
每个线程都会遍历到set集合的全部值,所以这种情况是线程安全的。
-END-
JAVA高级技术 | 数据结构与算法 | JVM | 并发 | 数据库 | 各种开源框架
以上是关于多线程使用for循环遍历同一个Set,是否线程安全?的主要内容,如果未能解决你的问题,请参考以下文章