`
yulon
  • 浏览: 117810 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ThreadLocal实现在同一个线程内的数据共享

阅读更多

1、了解ThreadLocal类.

      查看相关api文档,对该类描述如下:

      该类提供了线程局部变量。这些变量不同于它们的普通对应物,因为访问一个变量(通过其 getset 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的私有静态字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。

 

2、实验目的:在不同模块里共享同一个变量的引用,为了方便理解,你可以把不同的模块理解为不同的类,但模块有更广的概念.

     步骤:

     1、先定义一个自己的事务类MyTransaction,在该类中定义一个提交事务的方法commit();

     2、再定义一个自己的Session类MySession,在该类中定义一个beginTransaction方法和getTransaction方法,并定义一个ThreadLocal类的私有静态字段.

     3、分别定义两个模块: A类各B类

     具体模拟代码如下:

package test;
public class ThreadLocalTest {
	public static void main(String[] args) throws InterruptedException {
		final A a = new A();
		final B b = new B();
		for(int i=0;i<3;i++){
		new Thread(){
			public void run(){
				MySession session = new MySession(new MyTransaction());
				MyTransaction tx = session.beginTransaction();
				System.out.println("打开事务:"+tx);
				a.modify();
				b.save();
				tx.commit();//提交事务
				System.out.println();
			}	
		}.start();
		Thread.sleep(1000);
		}
	}
}	
	/**不同模块共享同一个变量*/
	class A{
		public void modify(){
			System.out.println(Thread.currentThread()+": A 得到的事务: "+MySession.getTransaction());
		}
	}
	class B{
		public void save(){
			System.out.println(Thread.currentThread()+": B 得到的事务: "+MySession.getTransaction());
		}
	}
	
	class MyTransaction{
		public void commit(){
			System.out.println("提交事务:"+this);
		}
	}
	class MySession{
		private static MyTransaction transaction= null;
		private static ThreadLocal threadLocal = new ThreadLocal();
		public MySession(MyTransaction transaction){
			this.transaction = transaction;
		}
		public MyTransaction beginTransaction(){
			transaction = (MyTransaction)threadLocal.get();
			if(transaction==null){
				transaction = new MyTransaction();
				threadLocal.set(transaction);
			}
			return transaction;
		}
		public static MyTransaction getTransaction(){
			return (MyTransaction)threadLocal.get();
		}
	}

 

打印结果如下:

打开事务:test.MyTransaction@3e25a5
Thread[Thread-0,5,main]: A 得到的事务: test.MyTransaction@3e25a5
Thread[Thread-0,5,main]: B 得到的事务: test.MyTransaction@3e25a5
提交事务:test.MyTransaction@3e25a5

打开事务:test.MyTransaction@19821f
Thread[Thread-1,5,main]: A 得到的事务: test.MyTransaction@19821f
Thread[Thread-1,5,main]: B 得到的事务: test.MyTransaction@19821f
提交事务:test.MyTransaction@19821f

打开事务:test.MyTransaction@addbf1
Thread[Thread-2,5,main]: A 得到的事务: test.MyTransaction@addbf1
Thread[Thread-2,5,main]: B 得到的事务: test.MyTransaction@addbf1
提交事务:test.MyTransaction@addbf1

 3、ThreadLocal的应用场景

     1、如:银行转帐包含一系列操作:把转出帐户的余额减少,把转入帐户的余额增加,这两个操作要在同一个事务中完成,它们必须使用相同的数据库连接对象,转入和转出操作的代码分别是两个不同的帐户对象的方法.

 

     2、又如:Struts2的ActionContex,同一段代码被不同的线程调用运行时,该项代码操作的数据是每个线程各自状态和数据,对于不同的线程来说,getContext方法拿到的对象都不相同,对同一个线程来说,不管调用getContext方法多少次和哪个模块getContext方法,拿到的都是同一个对象.

4
0
分享到:
评论

相关推荐

    java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解.pdf

    在Java中,有多种方式可以实现线程间的数据共享和对象独立,其中ThreadLocal是常用的工具之一。 在多线程环境下,共享数据通常会引发线程安全问题,比如上述例子中的“张三给李四转钱”场景,如果两个线程同时操作...

    ThreadLocal

    ThreadLocal的一个经典应用场景是在数据库连接池中,每个线程都可以有自己的数据库连接,而无需在多个线程间共享,这样可以简化代码并提高性能。另外,它也可以用于HTTP请求上下文,存储请求相关的数据,如用户会话...

    ThreadLocal应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...

    ThreadLocal的几种误区

    ThreadLocal是Java编程中一种非常特殊的变量类型,它主要用于在多线程环境下为每个线程提供独立的变量副本,从而避免了线程间的数据共享和冲突。然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将...

    18 线程作用域内共享变量—深入解析ThreadLocal.pdf

    【线程作用域内共享变量】 在Java并发编程中,线程...总之,`ThreadLocal`是一个强大的工具,适用于在特定线程内创建独立的变量副本,从而解决线程安全问题。但使用时需谨慎,合理利用,避免滥用和潜在的内存泄漏问题。

    使用ThreadLocal管理“session”数据

    在Java编程中,ThreadLocal是线程局部变量的类,它提供了一种在多线程环境中为每个线程创建和维护独立副本的机制。ThreadLocal主要用于解决线程间的数据隔离问题,确保各线程拥有自己的变量副本,避免了数据共享带来...

    Java多线程 之 临界区、ThreadLocal.docx

    在这个例子中,`ThreadLocalTest`类中的`threadLocal`变量为每个线程初始化一个随机值,并且`increament()`方法会增加当前线程的`ThreadLocal`变量的值。由于每个线程都有自己的副本,因此不会发生数据竞争。 总结...

    ThreadLocal原理及在多层架构中的应用

    - **线程隔离性**:ThreadLocal只在创建它的线程内有效,无法跨线程共享数据。 - **难以调试**:由于ThreadLocal的隐式性,有时可能会导致难以发现的问题,特别是当线程池中的线程复用时。 ### 4. 使用注意事项 - ...

    ThreadLocal原理及在多层架构中的应用.pdf

    总体来说,ThreadLocal是一种有效的多线程编程技术,能够解决多层架构中线程安全和数据共享的问题。正确使用ThreadLocal不仅可以保证数据的隔离性,还可以优化资源的使用效率和提高程序的性能。因此,作为架构师,...

    彻底理解ThreadLocal 1

    ThreadLocal是Java中用于线程局部变量的一个工具类,它允许在多线程环境下为每个线程创建独立的变量副本,从而避免了线程之间的数据共享和由此引发的并发问题。ThreadLocal不是一种线程同步机制,而是提供了一种线程...

    java事务 - threadlocal

    当Java事务与ThreadLocal结合使用时,可以在不同的线程中维护各自的事务状态,比如在Spring框架中,每个线程的ThreadLocal可以存储一个TransactionStatus对象,这样就可以在线程内部管理当前事务的状态,而不会影响...

    JavaWeb系列二十二: 线程数据共享和安全(ThreadLocal)

    JavaWeb系列二十二: 线程数据共享和安全(ThreadLocal)

    简单分析Java线程编程中ThreadLocal类的使用共

    这意味着在同一个ThreadLocal变量中,不同的线程可以存储各自独立的值,互不干扰。这在需要线程间隔离数据的场景下非常有用,例如数据库连接、事务状态等,避免了传统同步机制的复杂性和性能开销。 ThreadLocal的...

    ThreadLocal_ThreadLocal源码分析_

    ThreadLocal通常用于在多线程环境下为每个线程提供一个单独的实例,比如作为线程上下文的存储。 **ThreadLocal内部结构** ThreadLocal的工作原理基于Java的Thread类。在ThreadLocal中,每个实例都有一个内部Map,...

    ThreadLocal简单Demo

    在Java编程中,`ThreadLocal`是一个非常重要的工具类,它用于在多线程环境中提供线程安全的局部变量。`ThreadLocal`并不是一个线程,而是一个线程局部变量的容器,每个线程都有自己的副本,互不干扰。这使得线程间的...

    JDK的ThreadLocal理解(一)使用和测试

    **标题:“JDK的ThreadLocal理解(一)使用...通过以上分析,我们可以看到ThreadLocal在实现线程间数据隔离、简化多线程编程方面的作用。然而,使用时也要注意避免内存泄漏和过度依赖,合理规划其在系统架构中的位置。

Global site tag (gtag.js) - Google Analytics