美文网首页个人技术栈
ThreadLocal代码逻辑

ThreadLocal代码逻辑

作者: Chinesszz | 来源:发表于2017-08-28 19:14 被阅读7次

本例子主要目的,给每个线程赋予单独的变量副本,使各线程之间不互相影响

/**
 * @Package: com.example.thread
 * @Description: 序列号生成器
 * @author: liuxin
 * @date: 17/3/31 下午1:50
 */
public interface Sequence {
    int getNumber();
}

/**
 * @Package: com.example.thread
 * @Description: 每个线程调用都会刷新值去覆盖,所以,所有线程共同消费number
 * @author: liuxin
 * @date: 17/3/31 下午1:51
 */
public class SequenceA implements Sequence {
    private static volatile  int number=0;
    @Override
    public int getNumber() {
        number=number+1;
        return number;
    }
}

/**
 * @Package: com.example.thread
 * @Description: 局部线程变量池,每个线程使用自己的,所以各个线程之间不共享
 * @author: liuxin
 * @date: 17/3/31 下午1:58
 */
public class SequenceB implements Sequence {

    /**
     * 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
     * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
     * 从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。
     */
    private static ThreadLocal<Integer> numberContainer = new ThreadLocal<Integer>() {
        @Override
        protected Integer initialValue() {
            return 0;
        }
    };

    @Override
    public int getNumber() {
        numberContainer.set(numberContainer.get() + 1);
        return numberContainer.get();
    }
}
/**
 * @Package: com.example.thread
 * @Description: 多线程
 * @author: liuxin
 * @date: 17/3/23 下午4:35
 */
public class MyThread extends Thread {
    Sequence sequence;

    MyThread(Sequence sequence) {
        this.sequence = sequence;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName() + "<---->" + sequence.getNumber());
        }
    }

    public static void main(String[] args) {

        Sequence sequence = new SequenceA();
        MyThread t0 = new MyThread(sequence);
        MyThread t1 = new MyThread(sequence);
        MyThread t2 = new MyThread(sequence);
        t0.start();t0.setPriority(10);
        t1.start();t1.setPriority(9);
        t2.start();t2.setPriority(8);


        Sequence sequence1 = new SequenceB();
        MyThread t3 = new MyThread(sequence1);
        MyThread t4 = new MyThread(sequence1);
        MyThread t5 = new MyThread(sequence1);
        t3.start();t3.setPriority(7);
        t4.start();t4.setPriority(6);
        t5.start();t5.setPriority(5);


    }
}
        Thread-0<---->1
        Thread-0<---->2
        Thread-0<---->3
        Thread-1<---->4
        Thread-1<---->5
        Thread-1<---->6
        Thread-2<---->7
        Thread-2<---->8
        Thread-2<---->9
        Thread-3<---->1
        Thread-4<---->1
        Thread-3<---->2
        Thread-5<---->1
        Thread-3<---->3
        Thread-4<---->2
        Thread-5<---->2
        Thread-5<---->3
        Thread-4<---->3

自定义一个ThreadLocal,设计思路就是为每个线程保存一个变量副本
使用Map实现

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

/**
 * @Package: com.example.thread
 * @Description: 手动实现一个TheadLocal
 * @author: liuxin
 * @date: 17/3/31 下午2:22
 */
public class MyTheadLocal<T> {
    private Map<Thread, T> container = Collections.synchronizedMap(new HashMap<Thread, T>());
    
    public void set(T value){
        container.put(Thread.currentThread(),value);
    }
    
    public T get(){
       return container.get(Thread.currentThread());
    }
    
    public void remove(){
        container.remove(Thread.currentThread());
    }
    
    protected T initialValue(){
        return null;
    }
}

相关文章

  • ThreadLocal代码逻辑

    本例子主要目的,给每个线程赋予单独的变量副本,使各线程之间不互相影响 自定义一个ThreadLocal,设计思路就...

  • ThreadLocal的介绍及工作原理

    一、ThreadLocal的作用二、ThreadLocal的使用场景(1、2)三、ThreadLocal的使用代码...

  • ThreadLocal详解

    想要获取更多文章可以访问我的博客 - 代码无止境。 什么是ThreadLocal ThreadLocal在《Jav...

  • 当ThreadLocal碰上线程池

    ThreadLocal使用 ThreadLocal可以让线程拥有本地变量,在web环境中,为了方便代码解耦,我们通...

  • 谈谈那个听起来挺高大上的ThreadLocal

    ThreadLocal估计很多人都没听过,因为说实话平时写代码很少用到,我第一次看到代码里用ThreadLocal...

  • Java单线程ThreadLocal串值问题解决方案

    ThreadLocal ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。 代码 在app...

  • ThreadLocal、ThreadLocalMap源码分析

    ThreadLocal源码学习 ThreadLocal的工作过程更像是一个工具人,其核心代码set、get等都是通...

  • ThreadLocal分析

    上一次看ThreadLocal的源代码已经是很久之前的事情了,今早突然想起发现自己连ThreadLocal的原理一...

  • ThreadLocal

    ThreadLocal 简介ThreadLocal 使用ThreadLocal 原理InheritableThre...

  • 国产bmc项目bug调试总结

    1、代码逻辑不清晰,if嵌套过多。2、代码逻辑不清晰,逻辑代码书写较为分散 建议写法: 3、调试日志不规范。建议:...

网友评论

    本文标题:ThreadLocal代码逻辑

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