美文网首页
线程安全策略

线程安全策略

作者: 带娃儿先走 | 来源:发表于2018-03-31 15:09 被阅读0次

不可变对象

  • 对象创建以后其状态就不能修改
  • 对象所有域是final类型
  修饰类:不能被继承
  修饰方法:1、锁定方法类不能被继承修改
          2、效率
  修饰变量: 基本数据类型变量,引用类型变量。
package com.mmall.example.immutable;

import com.google.common.collect.Maps;
import com.mmall.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * final 修饰变量 (map 非线程安全)
 * Created by megan on 2018/3/31.
 */
@Slf4j
@NotThreadSafe
public class FinalExample {

    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);
        map.put(7, 8);
    }

    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 ;
    }
}

  • 对象是正确的创建的(在对象创建期间,this引用没有溢出)
不可变对象类
package com.mmall.example.immutable;

import com.google.common.collect.Maps;
import com.mmall.annoations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;
import java.util.Map;

/**
 * Collections.unmodifiableMap 修饰Map (线程安全)
 * Created by megan on 2018/3/31.
 */
@Slf4j
@ThreadSafe
public class CollectionsExample {

    private static Map<Integer, Integer> map = Maps.newHashMap();

    static {
        map.put(1, 2);
        map.put(3, 4);
        map.put(5, 6);
        map.put(7, 8);
        map = Collections.unmodifiableMap(map);
    }

    public static void main(String[] args) {
        /** 不允许这样做-》Collections.unmodifiableMap 保证了线程的安全 **/
        map.put(1, 3);
        log.info("{}", map.get(1));
    }
}

package com.mmall.example.immutable;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.mmall.annoations.ThreadSafe;


/**
 * Immutable --> ImmutableList,ImmutableSet,ImmutableMap
 * Created by megan on 2018/3/31.
 */
@ThreadSafe
public class GuavaImmutableExample {

    private final static ImmutableList<Integer> list = ImmutableList.of(1,2,3,4,5);

    private final static ImmutableSet set= ImmutableSet.copyOf(list);

    private final static ImmutableMap<Integer,Integer> map = ImmutableMap.of(1,2,3,4,5,6);

    private final static ImmutableMap<Integer,Integer> map2 = ImmutableMap.<Integer,Integer>builder().
            put(1,2).put(3,4).put(4,5).build();

    public static void main(String[] args) {
        /** 不允许修改 **/
        list.add(6);
        set.add(7);
        map.put(7,8);
        map2.put(6,7);
    }

}


线程封闭

  • Ad-hoc 线程封闭: 程序控制实现,最糟糕,忽略。
  • 堆栈封闭: 局部变量,无并发问题。
  • ThreadLocal线程封闭: 特别好的封闭方法。
package com.mmall.example.threadLocal;

import com.mmall.annoations.ThreadSafe;

/**
 * threadLocal ->线程封闭
 * Created by megan on 2018/3/31.
 */
@ThreadSafe
public class RequestHolder {

    private final static ThreadLocal<Long> requestHolder = new ThreadLocal<>();

    public static void add(Long id){
        requestHolder.set(id);
    }

    public static Long get(){
        return requestHolder.get();
    }

    public static void remove(){
        requestHolder.remove();
    }

}

相关文章

  • Spring中的Controller ,Service,Dao是

    结论:不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以...

  • 线程安全策略

    不可变对象(安全的) String类通过final修饰,为不可变对象public final class Stri...

  • 线程安全策略

    不可变对象 对象创建以后其状态就不能修改 对象所有域是final类型 对象是正确的创建的(在对象创建期间,this...

  • 线程安全策略

    策略1 - 不可变对象 对象创建以后其状态就不能修改。 对象所有域都是final类型。 对象是正确创建的(在对象创...

  • 线程安全策略

    1.使用 final 关键字创建不可变对象2.使用下列方法初始化对象 3.堆栈封闭:即在方法内定义变量4.Thre...

  • 关于线程安全策略

    四个线程安全策略 1、线程限制: 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2、共享只读: 一...

  • 线程安全策略(二)——线程封闭

    参考线程封闭 线程封闭 把对象封装到一个线程里,只有这一个线程能看到这个对象(即使这个对象不是线程安全的也不会出现...

  • Spring中的Bean是线程安全的吗?

    Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的...

  • 8 线程安全策略

    1️⃣不可变对象 1. 不可变对象需要满足的条件:① 对象创建后其状态就不能修改;② 对象所有域都是final类型...

  • 四、线程安全策略

    1、不可变对象 如果对象在发布之后不会被修改,那么对于其他在没有额外同步的情况下安全地访问这些对象的线程来说,安全...

网友评论

      本文标题:线程安全策略

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