• 不可变对象


    不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。

    可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。

    不可变类的优点:

    1.线程安全

    不可变对象是线程安全的,在线程之间可以相互共享,不需要利用特殊机制来保证同步问题,因为对象的值无法改变。

    可以降低并发错误的可能性,因为不需要用一些锁机制等保证内存一致性问题也减少了同步开销。

    2.易于构造、使用和测试

    一个类的private的方法会隐式的申明为final方法

    package com.mmall.concurrency.example.immutable;
    
    import com.google.common.collect.Maps;
    import com.mmall.concurrency.annoations.NotThreadSafe;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.Map;
    
    @Slf4j
    @NotThreadSafe
    public class ImmutableExample1 {
    
        private final static Integer a = 1;
        private final static String b = "2";
        private final static Map<Integer, Integer> map = Maps.newHashMap();
    
        static {
            map.put(1, 2);
            map.put(3, 4);
            map.put(5, 6);
        }
    
        public static void main(String[] args) {
    //        a = 2;
    //        b = "3";
    //        map = Maps.newHashMap();
            map.put(1, 3);
            log.info("{}", map.get(1));
        }
    
        private void test(final int a) {
    //        a = 1;
        }
    }
    View Code
    package com.mmall.concurrency.example.immutable;
    
    import com.google.common.collect.Maps;
    import com.mmall.concurrency.annoations.ThreadSafe;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.Collections;
    import java.util.Map;
    
    @Slf4j
    @ThreadSafe
    public class ImmutableExample2 {
    
        private static Map<Integer, Integer> map = Maps.newHashMap();
    
        static {
            map.put(1, 2);
            map.put(3, 4);
            map.put(5, 6);
            map = Collections.unmodifiableMap(map);
        }
    
        public static void main(String[] args) {
            map.put(1, 3);
            log.info("{}", map.get(1));
        }
    
    }
    View Code
    package com.mmall.concurrency.example.immutable;
    
    import com.google.common.collect.ImmutableList;
    import com.google.common.collect.ImmutableMap;
    import com.google.common.collect.ImmutableSet;
    import com.mmall.concurrency.annoations.ThreadSafe;
    
    @ThreadSafe
    public class ImmutableExample3 {
    
        private final static ImmutableList<Integer> list = ImmutableList.of(1, 2, 3);
    
        private final static ImmutableSet set = ImmutableSet.copyOf(list);
    
        private final static ImmutableMap<Integer, Integer> map = ImmutableMap.of(1, 2, 3, 4);
    
        private final static ImmutableMap<Integer, Integer> map2 = ImmutableMap.<Integer, Integer>builder()
                .put(1, 2).put(3, 4).put(5, 6).build();
    
    
        public static void main(String[] args) {
            System.out.println(map2.get(3));
        }
    }
    View Code
  • 相关阅读:
    [MySQL]You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
    mysql的索引
    Mysql中的Btree与Hash索引
    Tomcat集群的session共享
    Linux常用命令总结
    docker elk
    docker+mysql+zabix-server环境搭建
    centos7系统服务管理
    Linux vim常用命令
    linux系统日志查看
  • 原文地址:https://www.cnblogs.com/xiangkejin/p/9268572.html
Copyright © 2020-2023  润新知