java - 程序允许重复设置。怎么可能?

标签 java multithreading collections thread-safety set

我正在用线程检查 synchronizedSet 和 normal set。我写了下面的程序。

package thread;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * @author Sivaranjani D
 * 
 */

public class ThreadSafeCheck {
    public static void main(String[] args) {
        SyncList job = new SyncList();
        Thread t1 = new Thread(job);
        Thread t2 = new Thread(job);
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(job.set);
        System.out.println("Normal :" + job.set.size());
        System.out.println(job.synSet);
        System.out.println("Synchronized :" + job.synSet.size());
    }
}

class SyncList implements Runnable {
    Set<Integer> synSet = Collections.synchronizedSet(new HashSet<Integer>());
    Set<Integer> set = new HashSet<Integer>();

    public void run() {
        displaysynchronizedMap();
        displayNormalMap();
    }

    private void displaysynchronizedMap() {
        for (int i = 0; i < 50; i++) {
            synSet.add(i);
        }
    }

    private void displayNormalMap() {
        for (int i = 0; i < 50; i++) {
            set.add(i);
        }
    }
}

令我惊讶的是,set 允许重复。这怎么可能?有人请解释一下..

最佳答案

如果您同时修改一个未同步的数据结构,所有的赌注都会落空。您不能指望重复将被禁止。行为完全未定义:例如,demons may come out of your nose .

关于java - 程序允许重复设置。怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22566131/

相关文章:

c# - 在 C# 中,按字符串属性对对象列表进行排序并获得正确顺序的最佳方法是什么?

java - 创建通用数组列表时应该首选哪种方式?

Java与正则表达式、子串

java - 在数据源中创建不需要的空表

multithreading - 工作池模式 - 死锁

java - 关于事务管理的问题

java - 如何使用多个分隔符分割具有不同值的字符串?

java反射: Is it possible to override a private method by change method Id?

multithreading - 为什么异步被认为比多线程性能更好?

java - 按元素将列表拆分为 block