多线程使用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,是否线程安全?的主要内容,如果未能解决你的问题,请参考以下文章

使用多线程时如何添加到列表?

java多线程死循环

C#多线程实现循环。界面会假死怎么办?

Set类

使用多线程 for 循环

Java核心技术 卷1 多线程----线程安全的集合