创建一个线程安全的set集合

作者&投稿:仲长喻 (若有异议请与网页底部的电邮联系)
如何创建线程安全的list~

解决这个问题通常有两种方法(个人认为)
一:使用synchronized关键字,这个大家应该都很熟悉了,不解释了;
二:使用Collections.synchronizedList();使用方法如下:
假如你创建的代码如下:List> data=new ArrayList>();
那么为了解决这个线程安全问题你可以这么使用Collections.synchronizedList(),如:
List> data=Collections.synchronizedList(new ArrayList>());
其他的都没变,使用的方法也几乎与ArrayList一样,大家可以参考下api文档;
额外说下 ArrayList与LinkedList;这两个都是接口List下的一个实现,用法都一样,但用的场所的有点不同,ArrayList适合于进行大量的随机访问的情况下使用,LinkedList适合在表中进行插入、删除时使用,二者都是非线程安全,解决方法同上(为了避免线程安全,以上采取的方法,特别是第二种,其实是非常损耗性能的)。

  List集合:
  List list=new ArrayList();
list.add("a");
list.add("b");
list.add("c");
//将现有的List集合转换为线程安全的
list=Collections.synchronizedList(list);
System.out.println(list);

  Set集合:
  Set set=new HashSet();
//将现有的set集合转换为线程安全的
set=Collections.synchronizedSet(set);
  Map集合:
  Map map=new HashMap();
//将现有的Map转换为线程安全的
map=Collections.synchronizedMap(map);

可以利用Collections工具类的synchronizedSet方法修饰一个非同步的Set变成同步Set

Set<T> set = new HashSet<T>(); // 非同步,非线程安全的Set
Set<T> syncSet = Collections.synchronizedSet(set); // 返回了一个线程安全的Set


package test;

import java.util.LinkedList;
import java.util.Scanner;

public class A {
    public static void main(String[] args) {
        for(int i=0;i<1000;i++)
        {
            Thtrad.list.add("我是第"+(i+1)+"个元素");
        }
        
        for(int i=0;i<10;i++)
        {
            Thtrad thread = new Thtrad();
            thread.start();
        }
    }

}
package test;

import java.util.LinkedList;

public class Thtrad extends Thread{
    
    public static LinkedList list = new LinkedList<>();
    private boolean status = true;
    public void run()
    {
        while (true) {
            if(!list.isEmpty())
            {
                String a = (String) list.poll();
                System.out.println(Thread.currentThread().getName()+":"+"list元素:"+a);
            }
            else
            {
                status=false;
            }
            
            
        }
    }
}



请详细说一下java中append()的方法.
+“yyyy”相当‘+’号。跟String不同的是Stringbuffer是放一起的,String1+String2和Stringbuffer1.append("yyyy")虽然打印效果一样,但在内存中表示却不一样、String1+String2 存在于不同的两个地址内存,Stringbuffer1.append(Stringbuffer2)放再一起。StringBuffer是线程安全的,多用于多线程。

String 和StringBuffer StringBuild 的区别:
String是不可改变,定长;StringBuffer是不定长,可改变,通过分配更大的内存实现,StringBuffer是线程安全的可变字符序列。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步。StringBuilder是单个线程使用的StringBuffer等价类,一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API...

关于JAVA中的singleton模式
package test;public class Singleton { private Singleton s;private Singleton(){ } public static Singleton getSigleton(){ if(s==null)s=new Singleton();return s;} } 这就是一个单例模式,我想应该不用注释了,原理就是这个类的构造方法private了,所有在外边不能调用,也就不能new Singleton...

Java中HashMap和TreeMap的区别
HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。 HashMap 非线程安全 TreeMap 非线程安全 线程安全 在Java里,线程安全一般体现在两个方面: 1、多个thread对同一个java实例的访问(read...

printf是线程安全的吗
printf最终还是要写入 stdout文件中的,因此输出到文件是线程安全的(系统支持)。但是当其参数中存在指针类型(字符串指针)时,在多线程环境下可能crash。比如一个线程中打印时所用的字符串(动态分配),在另一个线程中被delete,这样造成第一个线程打印时会报错。结论是printf的数据输出为线程安全,但...

OC中weak的原理
   weak_entry_t 是 weak_table_t 具体存储的数据类型 DisguisedPtr<T> 是Runtime对于普通对象指针(引用)的一个封装,目的在于隐藏 weak_table_t 的内部指针。   RefcountMap 用于OC的引用计数机制; slock 实际上是 os_unfair_lock_s 类型,用于处理线程安全的问题; ...

C#中的invoke()如何控制线程啊
你是担心跨线程处理的时候控件出问题么?不知道下面这个你是否用的上。private void W_Reveive(string text)\/\/这里调用了一个委托,这样就可以在主线程刷新数据了 { if (this.textBox1.InvokeRequired)\/\/判断是否线程安全,如果不安全调用一个委托。{ D_power d = new D_power(W_Reveive);this...

python线程间通信的问题,回答有加分!300
那么带参数的怎么写呢?也很简单!首先定义一个槽函数:def imSlot(para): print para这个是带参数的槽函数,下面是:imThread.imslot[str].connect('imSlot')以上就是线程之间的方法了,子线程在执行的通行经过执行信号的话,子线程可以安全地执行而不会出现GUI主线程卡死的情况了。

Java两个线程操作一个变量,为什么变量的值会不一样呢
但是你不知道的是另外有一个人趁你不注意的时候偷偷向外拿苹果,结果你认为是10个,结果一数只有4个,另外6个你不知道到哪里去了。这意味着你发生了线程安全问题。根据不同的项目类型,如C\/S Application或者B\/S WEB,有多种控制线程安全性的方法。最直观的是使用“锁”,即第一个人把筐子抱过去...

求程序员面试题
4. 请说出你所知道的线程同步的方法。 wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的...

华县13743158431: 创建一个线程安全的set集合 -
禽庞久威: 可以利用Collections工具类的synchronizedSet方法修饰一个非同步的Set变成同步Set Set<T> set = new HashSet<T>(); // 非同步,非线程安全的Set Set<T> syncSet = Collections.synchronizedSet(set); // 返回了一个线程安全的Set

华县13743158431: c#中 有没有线程安全的list类 以及 线程安全的set类 -
禽庞久威: 你说的是java还是c++?java中解决这个问题通常有两种方法一:使用synchronized关键字;二:使用collections.synchronizedlist();假如你创建的代码如下:listdata=newarraylist();那么为了解决这个线程安全问题你可以这么使用collections.

华县13743158431: 创建一个Set集合,用Set集合保存用户控制台输入的20个字符串. -
禽庞久威: 展开全部1、定义一个set对象 Set h=new HashSet(); 2、往set中添加数据 h.add("1st");//往里添加一个字符串 Set是最简单的一种集合.集合中的对象不按特定的方式排序,并且没有重复对象. Set接口主要实现了两个实现类: HashSet : HashSet类按照哈希算法来存取集合中的对象,存取速度比较快 TreeSet : TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序

华县13743158431: 创建一个set集合 保存控制台输出的字符 并打印 -
禽庞久威: import java.util.HashSet; import java.util.Iterator; import java.util.Scanner; public class Read { public static void main(String args[]) { Scanner input = new Scanner(System.in);//得到扫描器,从控制台输入 HashSet<String> set = new HashSet<String...

华县13743158431: java多线程同步全局变量 -
禽庞久威: 1.使用JAVA Collections 这个类. 有 checkedList / Map / Set 方法. 将你的集合放进去,会返回给你一个线程安全的集合. 这样不需要你手动去做线程同步, java已经帮你做了.2.使用 synchronized 关键字, 同步 你的删除修改操作.3.使用 synchronized 修饰方法. 将修改删除的方法加锁.

华县13743158431: Java中Set、List、Map集合类(接口)的特点及区别.分别有哪些常用实现类. -
禽庞久威: list与Set、Map区别及适用场景1、List,Set都是继承自Collection接口,Map则不是2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的...

华县13743158431: Java线程安全,集合类练习 -
禽庞久威: 你是要长度为10的 队列吧?删除在头部,相当于出栈 那不就是先进先出么? --队列?然后给你搞一个多线程队列就ok了 --------------/** * 容量为10的 队列,多线程,线程要安全 * 容器为 集合,我选用linkedList,因为add 和 del 比较多,没说select...

华县13743158431: java语言如何创建set的一个实例 -
禽庞久威: java创建一个list集合,list是不能直接实例化的,所以要用其他的,如arraylist.1、list temp=new arraylist();2、temp.add(xxx).其他解决方法:1、list list = new arraylist();//创建集合对象;2、list.add("1");//在集合里存入数据.3、list.add("2");4、list是一个接口,不能实例化,创建对象时要使用他的实现类arraylist(其他).

华县13743158431: LinkedList和ArrayList的区别 -
禽庞久威: ArrayList是一个动态数组,也是我们最常用的集合.它允许任何符合规则的元素插入甚至包括null.每一e68a84e8a2ad3231313335323631343130323136353331333363366139个ArrayList都有一个初始容量(10),该容量代表了数组的大...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网