线程范围内的线程共享(多线程)

首先介绍一下两个方法:

1.通过Map进行实现

主键为Thread ,value 为数据,

主要思路为:与线程绑定,不同的线程之间的数据相互独立

2.通过ThreadLocal 实现

首先先介绍一下ThreadLocal 的原理

每个Thread ,都有一个ThreadLocalMap ,所以每次通过ThreadLocal .get的时候,相当于是在当前线程的ThreadLocalMap  查查找 key为 ThreadLocal(调用者)的value值。

这个是ThreadLocal  get方法的源码

ThreadLocal的主要应用场景:

1.用来解决数据库连接、Session管理

    private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
        public Connection initialValue() {
            return DriverManager.getConnection(DB_URL);
        }
    };  

    public static Connection getConnection() {
        return connectionHolder.get();
    }
private static final ThreadLocal threadSession = new ThreadLocal();  

public static Session getSession() throws InfrastructureException {
    Session s = (Session) threadSession.get();
    try {
        if (s == null) {
            s = getSessionFactory().openSession();
            threadSession.set(s);
        }
    } catch (HibernateException ex) {
        throw new InfrastructureException(ex);
    }
    return s;
}

2.第二个场景用于:

线程多实例,需要保存分离每个线程的数据

时间: 2024-10-23 13:30:26

线程范围内的线程共享(多线程)的相关文章

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

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

多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)

多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有如下两种方式来实现这些Runnable对象之间的数据共享:            将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象.每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行的各个

线程池: 等待线程池内所有线程执行完毕后再继续任务

boolean loop = true; do{ loop=!executorService.awaitTermination(2, TimeUnit.SECONDS); }while(loop);

如何实现线程范围内共享数据 -- 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

ThreadLocal实现:java线程范围内的共享数据,线程外独立

场景应用:银行转账时,A给B转账,C给D转账.两者都是调用的connection.begainTransaction();connection.commit(); 如何才能保证A,B同在一个线程中,C.D同在一个线程中,且A,BC,D在线程内共享,在线程外独立. 方法一,Map<Thread, Integer>实现: /** * 线程范围内的共享数据 */ package cn.itcast.lesson5; import java.util.HashMap; import java.util

Java线程范围内的共享数据

线程范围内的共享数据,在JavaEE中比较常用,Android比较少 一个线程调用A,B,C三个模块,模块中的表达式或变量调用访问一个数据,这个数据可以是静态的 另一个线程也调用A,B,C三个模块,模块中的表达式或变量访问的数据,就不是刚才的数据,而是另一个 同样的代码,一个线程身上一分数据 [java] view plaincopy import java.util.HashMap; import java.util.Map; import java.util.Random; public c

Java线程与并发库高级应用-线程范围内共享数据ThreadLocal类

1.线程范围内共享变量 1.1 前奏: 使用一个Map来实现线程范围内共享变量 public class ThreadScopeShareData { static Map<Thread, Integer> dataMap = new HashMap<Thread, Integer>(); public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable

多线程之线程范围内的数据共享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