关闭

ThreadLocal 线程范围的共享变量

331人阅读 评论(0) 收藏 举报
分类:


上图说明的是 比如两个转账线程 ,需要有事务控制,当然这个事务控制需要时connection级别的,因此两个线程都要有自己的connection ,并且互不影响,这样当一个事务提交的时候 才不会影响另一个事务的的状态,通过把connection设置为ThreadLocal变量 不同的线程使用各自的connection。

下面 展示的是 使用ThreadLocal变量 来为两个线程分配数据


在主线程里面开辟了两个子线程,同时在主类里面设置了一个静态成员变量x为ThreadLocal类型,两个线程分别产生一个随机数,并放到自己的线程共享变量中,然后再调用

A模块 从该线程中取出该数据,调用B模块从该线程中取出数据,运行结果为 线程1的A和B模块取出的数据为线程1的存储数据,线程2的A和B模块取出的为线程2的存储数据

因为ThreadLocal底层 是通过hashmap实现的,所以一个线程key 只能对应一个value,如果要一个线程共享两个变量就需要设置两个ThreaLocal变量,但是我们实际上是没有必要的,因为我们可以共享一个对象,一个Thread key对应一个对象,对象里面可以存放多个值,从而实现 一个ThreadLocal变量存储多个共享数据。


下面介绍一个Threadlocal在单例模式的应用,


正常情况下,我们的单例模式的getInstance()方法是需要加上synchronized的关键字的,因为当一个线程进入到了new MyThreadScopeData()部分的时候,另一个线程也进来了 就会new 出两个对象,当然后一个对象会覆盖前一个对象,现在我们对他进行改造,我们把MyThreadScopeData对象作为一个变量 存入ThreadLocal中,这样我们每个线程拿到的instance也都是每个线程的instance  互不影响,每个线程都会有自己的线程范围内的共享MyThreadLocal对象,我们拿到这个对象后可以对这个对象做任何操作,都会不会对其他线程有任何影响,因为这个每个线程都只会使用同一个MyThreadlocal对象。 这种方式比把ThreadLocal内存储对象 再拿对象要优雅。相当于 把与线程相关的数据和处理都集成到了一个类,专门用来处理与线程相关的内容。


但是这里有一个问题,每个线程到来的时候都会new 一个属于该线程的对象出来,我们并没有为每个线程死亡的时候消除依附于这个线程而生的数据对象。





 

0
0
查看评论

Thread学习(八) ThreadLocal实现线程范围内的共享变量

什么叫线程范围内的共享数据(线程外独立)? 一个线程在运行的时候可以调用A模块,B模块,C模块,就比如我们调用A,B,C三个对象,A,B,C三个模块内部的代码就要访问外面的变量,那么此时如果我们把ABC调用的那个变量设置成static的静态变量,我们也可以实现让ABC同时访问同一个变量,但是如果我...
  • a347911
  • a347911
  • 2016-11-24 15:13
  • 1701

银行取款[多线程]{使用ThreadLocal管理共享变量,但此场景并不保证线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题。 此处用多线程实现,同时取款的模拟实现,使用ThreadLocal管理共享变量,但此场景并不保证线程同步,查看取款安全隐患问题,代码如下: -----------------------------...
  • typa01_kk
  • typa01_kk
  • 2015-07-03 18:58
  • 3626

ThreadLocal实现线程范围的共享变量

threadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另一个线程中则共享另一份数据,线程的数据是独享的。  ThreadLocal的实现原理:每个线程调用全局ThreadLocal的set方法,就相当于往其...
  • tianwei7518
  • tianwei7518
  • 2014-03-22 15:49
  • 438

ThreadLocal实现线程范围的共享变量 代码示例

package org.wy.threadlocal;import java.util.Random;public class ThreadLocalTest {private static ThreadLocal threadLocal = new ThreadLocal();public sta...
  • u011729897
  • u011729897
  • 2013-08-18 08:01
  • 280

多线程 : ThreadLocal 实现线程间共享变量隔离例子

package thread; import java.util.Random; public class ThreadLocalShareDataDemo { /** * ThreadLocal类及应用技巧 将线程范围内共享数据进行封装,封装到一个单独的数据类中,提供设置获取方法 ...
  • hackeraaa
  • hackeraaa
  • 2016-03-13 11:46
  • 359

线程范围内共享变量的概念与作用(五)

就是要实现线程一和线程二里面的数据是分离的,但是线程一里面的数据是可以共享,这让我想到我当初做下载管理的时候就是这种方式,数据多了就使用集合保存起来 public class ThreadScopeShareData { private static int data = 0; pri...
  • lijinhua7602
  • lijinhua7602
  • 2015-01-28 23:34
  • 614

【Java多线程与并发库】5.线程范围内共享变量的概念与作用

我们可以使用ThreadLocal实现线程范围的共享变量。 ThreadLocal的作用和目的,用于实现线程内的数据共享,即对于相同的程序代码,多个模块在 同一个线程中运行时要共享一份数据,而在另外线程中运行又共享另外一份数据。 线程范围内共享数据的示意图: 每个线程调用全局ThreadLo...
  • u013517797
  • u013517797
  • 2016-10-11 12:58
  • 1325

Java线程总结(四):ThreadLocal实现线程范围的共享变量

ThreadLocal是线程本地变量,能实现线程范围的共享变量,具体概念这里不在概述。我们知道java web中spring的事务管理能将“service的一个方法调用多次dao里的方法”操作数据库保持在同一事物里。话不多说,来模拟一下事务管理来展示ThreadLocal的作用(不是spring源码...
  • u011535508
  • u011535508
  • 2016-09-13 15:17
  • 211

【线程高新】——【ThreadLocal实现线程范围的共享变量】

先说明问题:先让每个线程都有自己线程范围内的共享变量 package com.xiaozhi.threadlocal; import java.util.Random; public class Test { private static int data=0; public sta...
  • jingtianxiaozhi01
  • jingtianxiaozhi01
  • 2013-11-13 20:57
  • 442

ThreadLocal线程范围内的共享变量

数据库connection和strut2每个请求用到ThreadLocalimport java.util.Random; public class ThreadLocalTest {     private ...
  • jethai
  • jethai
  • 2016-08-28 14:06
  • 224
    个人资料
    • 访问:47466次
    • 积分:965
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:25篇
    • 译文:1篇
    • 评论:4条
    文章分类
    最新评论