当前位置: 首页 > 编程笔记 >

如何在Java中使类成为线程安全的?

皮骏
2023-03-14
本文向大家介绍如何在Java中使类成为线程安全的?,包括了如何在Java中使类成为线程安全的?的使用技巧和注意事项,需要的朋友参考一下

线程安全类是保证从多个线程并发调用时正确的类的内部状态以及方法返回的值的类。

HashMap是一个非同步的集合类。如果我们需要对其执行线程安全操作,则必须显式同步它。

例:

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;

public class HashMapSyncExample {
   public static void main(String args[]) {

      HashMap hmap = new HashMap();
      hmap.put(2, "Raja");
      hmap.put(44, "Archana");
      hmap.put(1, "Krishna");
      hmap.put(4, "Vineet");
      hmap.put(88, "XYZ");

      Map map= Collections.synchronizedMap(hmap);
      Set set = map.entrySet();
      synchronized(map){
            Iterator i = set.iterator();
          //显示元素
         while(i.hasNext()) {
               Map.Entry me = (Map.Entry)i.next();
               System.out.print(me.getKey() + ": ");
               System.out.println(me.getValue());
         }
      }
   }
}

在上面的示例中,我们有一个HashMap,它具有整数键和String类型值。为了使其同步,我们使用Collections.synchronizedMap(hashmap)。它返回由指定的HashMap备份的线程安全映射。

输出:

1: Krishna
2: Raja
4: Vineet
88: XYZ
44: Archana
 类似资料:
  • 问题内容: 据我所知,这是可变的,因此,如果多个线程试图访问和修改它,则不是线程安全的。我们如何使用客户端锁定或组合(包装器)使其成为线程安全的? 问题答案: 按照从好到坏的顺序: 根本不使用它,请查看Java 8的新Date and Time API。 完全不使用它,请查看jodatime 在所有的,使用不使用或一成不变的原始与代表 纪元时间 封装它。始终返回的防御性副本,从不引用内部对象 在实

  • 问题内容: 我是Go的新手,我需要创建一个线程安全的变量。我知道在Java中您只能使用关键字,但是似乎没有类似的东西存在。有什么方法可以同步变量? 问题答案: Java中的一种意思是仅允许单个线程(在任何给定时间)执行代码块。 在Go中,有很多构造可以实现该目标(例如互斥体,通道,等待组,中的原语),但是Go的谚语是: “不要通过共享内存进行通信;而是通过通信来共享内存。” 因此,不要锁定和共享变

  • 我一直在浏览JCIP,作者说。。 线程限制的一种特殊情况适用于可变变量。对共享的易失性变量执行读-修改-写操作是安全的,只要您确保该易失性变量仅从单个线程写入 例如,实例计数被认为是一个复合操作(读取值,向其添加一个值,并更新值),声明计数为易失性不会使此操作原子化,因此线程安全在这里得不到保证!!我说得对吗??但是在这里,作者说如果我们确保只从单个线程写入易失性变量,我们就可以修复它。我不明白这

  • 我有一个简单的静态日志记录类。但是,它肯定不是线程安全的,因为每个调用都试图写入同一个文件。我得到了这些例外情况: 什么是最好的方法使它的线程安全? 作为一个日志记录函数,我希望能够从代码的许多不同部分访问它(因此,我选择它为静态的原因)。然而,我想要使它成为线程安全的,我总是必须向它传递一个公共对象来lock(),我认为这违背了静态函数的目的。还是事实并非如此?

  • 本文向大家介绍如何测试Java类的线程安全性,包括了如何测试Java类的线程安全性的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了如何测试Java类的线程安全性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 线程安全性是Java等语言/平台中类的一个重要标准,在Java中,我们经常在线程之间共享对象。由于缺乏线程安全性而导致的问题很难

  • 问题内容: 我有一个应用程序,要求给定相同的随机种子,结果相同。但是我发现random.randint不是线程安全的。我已经尝试过互斥锁,但这不起作用。这是我的实验代码(很长但很简单): 我想编码打印 true,true ,但是它有机会给出 false,false 。如何制作线程安全的randint? 问题答案: 其他人指出了以线程安全方式使用的正确方法。但是我觉得必须指出,您编写的代码对任何内容