美文网首页
用不可变类保证并发访问的安全性

用不可变类保证并发访问的安全性

作者: Kaki001 | 来源:发表于2018-09-15 20:22 被阅读0次

不可变类

谷歌的guava工具集合为我们提供了不可变的集合类。
例如:

  • com.google.common.collect.ImmutableMap
  • com.google.common.collect.ImmutableList
  • com.google.common.collect.ImmutableSet

等等。
我们可以使用这些类来保证我们提供给调用方的数据是不可以改变的,从而保证我们的数据的安全性。

原子访问引用类型

根据 Effective Java 的原则 66-同步访问共享的可变数据,

我们使用一些配置信息集合,公共常量集合的时候,应该尽量使用不可变类。

并且还要保证,在动态的重新加载这些信息的时候,保证用户访问不会出现并发问题。

下面我们来结合下面的的引用原子类型来做一个小例子来演示这个原则。

  • java.util.concurrent.atomic.AtomicReference
package com.geh.learn.guava;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;

import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

/**
 * Immutable Collection Show Case
 *
 * @author 戈輝
 */
public class ShowImmutableCase {

    private static final AtomicReference<ImmutableMap<String, User>> userMapRef = new AtomicReference<>(ImmutableMap.of());

    static {
        init();
    }

    /**
     * user info init
     */
    public static void init() {
        // 下面的处理实际可能从数据库或者可变的配置文件中读取 
        User user01 = new User("userKaki01", "東京");
        User user02 = new User("userKaki02", "大阪");
        Map<String, User> userMap = Maps.newHashMap();
        userMap.put(user01.getUsername(), user01);
        userMap.put(user02.getUsername(), user02);
        
        // 初始化可以对外访问的集合类型
        userMapRef.set(ImmutableMap.copyOf(userMap));
    }

    public static void main(String[] args) {
        System.out.println("userKaki01 exist ? : " + userMapRef.get().containsKey("user01"));
    }
}

class User {

    private String username;

    private String address;

    public User(String username, String address) {
        this.username = username;
        this.address = address;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

相关文章

  • 用不可变类保证并发访问的安全性

    不可变类 谷歌的guava工具集合为我们提供了不可变的集合类。例如: com.google.common.coll...

  • Scala 集合与算子

    Scala 同时支持不可变集合和可变集合,不可变集合可以安全的并发访问,Scala 默认采用不可变集合。可变集合:...

  • 理解不可变集合 | Guava Immutable与JDK un

    1、为什么需要不可变集合 (1)保证线程安全:在并发程序中,使用Immutable既保证线程安全性,也大大增强了并...

  • 多线程

    线程安全性 多线程时,使用同步机制,对于可变的共享对象的访问/修改,需要保证数据的正常。- 注:访问也是需要同步的...

  • 集合库-collection

    scala同时支持不可变集合和可变集合,因为不可变集合可以安全的并发访问,所以他也是默认使用的集合库类。在scal...

  • 并发编程建议

    1.给线程命名这样可以帮助调度。 2.使用不可变类,把有属性和类都是final不可变的,可保证线程安全。 3.总是...

  • Java并发编程实战-简单整理(上)

    1. 线程安全性 构建并发程序时, 必须正确的使用线程和锁. "共享"意味着变量可以由多个线程同时访问, 而"可变...

  • Java并发

    2.8 Java并发 2.8.1 线程安全性 当多个线程访问某个类时,这个类始终能表现出正确的行为,那么就称这个类...

  • 用不变对象解决竞态问题

    不可变对象 所有并发问题都是由于多个线程同时访问对象的某个可变属性引起的, 如果对象是不可变的, 那么所有的并发问...

  • 第二章-线程安全性

    线程安全核心: 共享: 可变: 同步: 如何修复多个线程访问可变状态是发生的错误: 2.1 什么是线程安全性 无状...

网友评论

      本文标题:用不可变类保证并发访问的安全性

      本文链接:https://www.haomeiwen.com/subject/ynmtnftx.html