单线程范围内的数据共享_ThreadLocal

单线程范围内数据共享使用ThreadLocal

/**
 * @Description    TODO
 * @author         [email protected]
 * @since          2015年12月12日
 * @version        V1.0
 */

public class DataShare {
    /**
     * ThreadLocal:保存和当前线程相关的变量数据
     * 线程范围内的数据共享 ThreadLocal
     * 优雅的设计方式,Person
     * 每一个线程使用完毕要清空ThreadLocal保存的当前变量
     *
     * 如何判断一个线程结果:监听器,回掉函数
     * 当一个线程结束的时候,主动调用回掉函数表示函数结束。
     * 怎么得到线程结束的通知 :ThreadDeathEvent
     * 在虚拟机结束的时候发邮件
     *
     * ThreadDeatRequest
     * com.sun.jdi.request //sun公司给开发虚拟机用的,不对普通开发人员开放
     *
     */

    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                Person.getInstance().setName("zhangsan");
                Person.getInstance().setAge(25);
                new A().getName();
                new B().getName();

            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                Person.getInstance().setName("lisi");
                Person.getInstance().setAge(28);
                new A().getName();
                new B().getName();

            }
        }).start();
    }

}

class A{
    public void getName(){
        System.out.println("A "+Thread.currentThread().getName()+":"+Person.getInstance().getName());
    }
}
class B {
    public void getName(){
        System.out.println("B "+Thread.currentThread().getName()+":"+Person.getInstance().getName());
    }
}

Person类:

package com.ctyun.thread.datashare;

/**
 * @Description TODO
 * @author [email protected]
 * @since 2015年12月12日
 * @version V1.0
 */

public class Person {
    // 优雅的设计方式,将ThreadLocal封装到bean内部,隐藏变化
    private static ThreadLocal<Person> instance = new ThreadLocal<Person>();

    private Person() {
    }

    public static Person getInstance() {
        Person p = instance.get();
        if (p == null) {
            p = new Person();
            instance.set(p);
        }

        return p;
    }

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

ThreaLocal的remove方法,可以移除当前线程绑定在ThreadLocal上的所有变量数据。

时间: 2024-11-14 05:26:27

单线程范围内的数据共享_ThreadLocal的相关文章

多线程之线程范围内的数据共享ThreadLocal

如果多个线程使用同一个数据,那么如何保证线程范围内的数据共享. 我们可以使用一个map来存储当前线程,以及其数据如下: package andy.thread.traditional.test; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * @author Zhang,Tianyou * @version 2014年11月8日 下午2:12:44 */ // 线程范围内的共享数据 pu

4、线程范围内的数据共享之ThreadLocal

1 /** 2 * 线程范围类的数据共享 3 * 核心:ThreadLocal类 4 * 实际场景: 5 * Hibernate的getCurrentSession方法,就是从线程范围内获取存在的session,如果不存在则新建一个并绑定到线程上 6 * struts将一个请求里的所有参数绑定到一个线程范围内的对象里 7 * @author yzl 8 * 9 */ 10 public class ThreadPart_4 { 11 public static void main(String[

多线程范围内的数据共享

多线程范围内的共享解决方法参考有4中: 1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,将共享数据放在runnable对象 2.如果多个线程执行的代码不同,将共享数据封装到一个对象中,将这个对象逐一传递给各个runnable对象 3.如果多个线程执行的代码不同,将共享数据作为外部类的final成员变量,将不同的runnable对象作为内部类主动取数据 4.将数据声明为static的方式() 见如下示例: 1.如果线程执行的代码相同,多个线程共享同一个runnable对象时,

多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)

ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量. 1.下图和辅助代码解释ThreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据. 2.每个线程调用全局ThreadLocal

Java线程(二):线程数据共享及ThreadLocal使用

一.线程范围内共享数据 1.线程范围内共享数据是指要实现这三个对象在同一个线程上访问的数据的一致性,不同线程访问的差异性. 2.如有三个对象A.B.C,两个线程@,#,那么线程范围内共享数据就是指ABC在线程@上访问的数据是相同的.而三个对象访问 @和访问 # 的数据时不同的. 有几个线程就会有几份数据.如下图所示: 3.实现:利用Map<Thraed,data>来实现,Map的Key是关键. 4.代码实现: 1)线程会访问模块: 2)线程负责放数据: 3)模块负责从访问的线程中拿数据. 4)

如何实现线程范围内共享数据 -- ThreadLocall类及其应用技巧

目标:如何保证各自线程上的数据是独立的,即A线程上数据只能被A线程操作 1:示例线程共享变量 我们先来看一个反例 package com.prepare.study; import java.util.Random; /** * @author: yinlm * @Date: Created in 2018/4/18 * @Description:多个线程数据混乱的示例 */ public class ThreadTest2 { // static 修饰 表示这是个全局变量 private st

JAVA多线程提高三:线程范围内共享变量&amp;ThreadLocal

今天我们学习的是如何在线程自己的范围内达到变量数据的共享,而各个线程之间又是互相独立开来,各自维护的,即我们说的ThreadLocal的作用. 一.概念 可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据,就可以实现线程范围内共享相同的变量. 二.代码 Runnable中的run()方法里面执行Thread.currentThread()都会对应当前Runnable对应的线程,因此A.B中对应的Thread.currentThread

java多线程一览

线程概述: 多线程的目的,不是提高程序的执行速度,而是提高程序的使用率(能抢到CPU的可能比较大). 因为线程是CPU调度的基本单位,所以,当一个程序的线程较多的时候就更容易抢到cpu的资源 进程: 运行中的程序,是系统进行资源分配和调度的独立单位 每个进程都有他自己的内存空间和系统资源 线程: 是进程中的单个顺序控制流,是一条执行路径,是cpu调度的基本单位 一个进程如果有多条执行路径,称:多线程 一个进程如果只有一条执行路径,称:单线程 线程生命周期: java中线程概览: [ ps : 图

jdk1.5线程知识列表

1.线程范围内的数据共享.通过map模拟,struts2框架中应用这种原理. 2.jdk1.5 通过ThreadLocal可以实现线程范围内的数据共享. 3.线程范围内共享数据的方式.对共享资源进行单一操作或进行多种操作. 4.Java5 原子性操作类 java.util.concurrent.atomic.     AtomicIntegerFieldUpdater对类的属性进行操作 5.Java5 并发库的应用 java.util.concurrent.Executors -> newFix