013.多线程-ThreadLocal

版权声明:本文为博主原创文章,允许转载,请标明出处。

为每一个线程提供一个局部变量。

code of demo:

  • 创建三个线程,分别打印递增的IDS

错误demo

package cn.qbz.thread;

/**
 * @Author: 花生米
 * @Date: 2018/11/16 18:15
 */
public class ThreadLocalTest {
    public static void main(String[] args) {
        //创建三个线程,每个线程均获得其IDS
        Ids ids = new Ids();
        GetIds t1 = new GetIds(ids);
        GetIds t2 = new GetIds(ids);
        GetIds t3 = new GetIds(ids);

        t1.start();
        t2.start();
        t3.start();
    }

}

class GetIds extends Thread {
    private Ids ids;

    public GetIds(Ids ids) {
        this.ids = ids;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(getName() + "..." + ids.nextId());
        }
    }
}

class Ids {
    private int id = 0;

    public int nextId() {
        return id++;
    }
}

通过创建多个被执行对象来解决

package cn.qbz.thread;

/**
 * @Author: 花生米
 * @Date: 2018/11/16 18:15
 */
public class ThreadLocalTest {
    public static void main(String[] args) {
        //创建三个线程,每个线程均获得其IDS
        Ids ids1 = new Ids();
        Ids ids2 = new Ids();
        Ids ids3 = new Ids();
        GetIds t1 = new GetIds(ids1);
        GetIds t2 = new GetIds(ids2);
        GetIds t3 = new GetIds(ids3);

        t1.start();
        t2.start();
        t3.start();
    }

}

class GetIds extends Thread {
    private Ids ids;

    public GetIds(Ids ids) {
        this.ids = ids;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(getName() + "..." + ids.nextId());
        }
    }
}

class Ids {
    private int id = 0;

    public int nextId() {
        return id++;
    }
}

使用Thread Local包装Ids

package cn.qbz.thread;

/**
 * @Author: 花生米
 * @Date: 2018/11/16 18:15
 */
public class ThreadLocalTest {
    public static void main(String[] args) {
        //创建三个线程,每个线程均获得其IDS
        Ids ids = new Ids();
        GetIds t1 = new GetIds(ids);
        GetIds t2 = new GetIds(ids);
        GetIds t3 = new GetIds(ids);

        t1.start();
        t2.start();
        t3.start();
    }

}

class GetIds extends Thread {
    private Ids ids;

    public GetIds(Ids ids) {
        this.ids = ids;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(getName() + "..." + ids.nextId());
        }
    }
}

class Ids {
    ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);

    public int nextId() {
        threadLocal.set(threadLocal.get() + 1);
        return threadLocal.get();
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

Java Web Response对象的27个方法及状态码

response表示HttpServletResponse对象,主要将JSP容器处理后的结果传回到客户端。 ? 网络配图 1、void addCookie(...

4817
来自专栏野路子程序员

爱奇艺弹幕解码 JS+ArrayBuffer+ungzip+utf8ArrayToStr

7477
来自专栏Linyb极客之路

编码习惯之参数校验和国际化规范

今天我们说说参数校验和国际化,这些代码没有什么技术含量,却大量充斥在业务代码上,很可能业务代码只有几行,参数校验代码却有十几行,非常影响代码阅读,所以很有必要把...

3206
来自专栏pangguoming

C# 事件(Event)

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。事件是用...

3795
来自专栏Android机动车

重新认识ThreadLocal

ThreadLocal 是一个线程内部的数据存储类,通过它可以在 指定的线程中 存储数据,数据存储以后,只有在指定线程中可以获取到存储的数据,对于其他线程来说则...

763
来自专栏java架构师

金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之二:ThreadLocal和Valotile

金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之二:ThreadLocal和Valotile 继续面试大纲系列文章。   ThreadLocal和V...

2784
来自专栏GreenLeaves

C# 多线程学习系列四之取消、超时子线程操作

虽然ThreadPool、Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常、或者子线程的业务逻辑不符合我们的预...

2202
来自专栏向治洪

android Handler机制之ThreadLocal详解

概述 我们在谈Handler机制的时候,其实也就是谈Handler、Message、Looper、MessageQueue之间的关系,对于其工作原理我们不做详解...

2119
来自专栏知了

ijst:基于反射的 C++ JSON 反序列化库

ijst (iJsonStruct) 一个是 C++ Json 序列化/反序列化库:

3185
来自专栏MasiMaro 的技术博文

ATL模板库中的OLEDB与ADO

上次将OLEDB的所有内容基本上都说完了,从之前的示例上来看OLEDB中有许多变量的定义,什么结果集对象、session对象、命令对象,还有各种缓冲等等,总体上...

1442

扫码关注云+社区

领取腾讯云代金券