`
dannyhz
  • 浏览: 387285 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

threadlocal 的例子 自己写的

阅读更多
引用

thread local variable 就是这么拉风,在多线程的情况下, 把一个公用的类可以共享而没有多线程的问题




先写一个接口
package com.ssc.dbcttool.test;

public interface Exec {
	public Exec firstActionToPrepare();
	
	public void secondAction();
}



再写一个客户端
package com.ssc.dbcttool.test;


public class PatternExec {
	
	public static void main(String[] args) {
		
		Exec onlyOne = new Processor();  体现出本例需要的threadlocal的风采
		//Exec onlyOne = new Processor1();  low 逼 同意变量被反复自增的现象

		Thread t1 = new DoThingThread(onlyOne);
		Thread t2 = new DoThingThread(onlyOne);
			
		t1.start();
		t2.start();
		
	}

	
	
}

这个线程里用的都是接口 这个在后面使用的时候很方法, 客户端修改测试,只需要改具体实现类就可以
class DoThingThread extends Thread{
	
	private Exec only;
	
	public DoThingThread(Exec onlyOne){
		only = onlyOne;
	}
	
	@Override
	public void run() {
		
		only.firstActionToPrepare().secondAction();
		
	}
	
}



第一个使用 线程内部变量的processor  , 在客户端被两个线程各调用一次的时候, 不会有累加的情况发生, 打印出来时 localVal的值始终就是1

package com.ssc.dbcttool.test;

public class Processor implements Exec{
	
	private ThreadLocal<Integer> localVal = new ThreadLocal<Integer>();
	
	
	public Exec firstActionToPrepare(){
		if(localVal.get()!=null){
			Integer oldVal = localVal.get();
			localVal.set(Integer.valueOf(oldVal.intValue() + 1));
		}else{
			localVal.set(Integer.valueOf(1));
		}
		
		return this;
	}
	
	public void secondAction(){
		System.out.println(localVal.get());
	}
}



第二个类使用了 一个变量, 传入两个线程, 线程赋值的速度很快,并且使用实际上同一个变量,最终结果是 val 变成 2了
package com.ssc.dbcttool.test;

public class Processor2 implements Exec{
	
	private Integer localVal = new Integer(0);
	
	
	public Exec firstActionToPrepare(){
		
		localVal++;
		
		return this;
	}
	
	public void secondAction(){
		System.out.println(localVal);
	}
}


分享到:
评论

相关推荐

    ThreadLocal应用示例及理解

    在这个例子中,每个线程都有自己的计数器副本,互不干扰。 ### 理解ThreadLocal原理 ThreadLocal内部通过一个ThreadLocalMap来存储每个线程的副本。这个Map的键是ThreadLocal实例,值是线程的局部变量。每个线程都...

    线程ThreadLocal机制实现例子

    本例以序列号生成的程序为例,展示ThreadLocal的使用

    事务的封装和Threadlocal实例

    例如,我们可以创建一个ThreadLocal变量来保存每个线程的JDBC连接,这样每个线程都有自己独立的连接,避免了连接的共享和线程安全问题。下面是一个ThreadLocal的简单应用示例: ```java public class ...

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

    首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程可以拥有自己独立的数据副本,而不会与其他线程共享。这意味着,即使多个线程访问相同的变量,它们也各自拥有这个变量...

    Java资料-详解ThreadLocal

    在这个例子中,`threadLocal`变量被两个线程分别设置为10和20,每个线程看到的都是自己设置的值,不会互相干扰。这是因为`ThreadLocal`在每个线程内部维护了一个独立的副本。 值得注意的是,虽然`ThreadLocal`可以...

    JAVA ThreadLocal类深入

    在这个例子中,getSession()方法会检查ThreadLocal中是否存在Session,若不存在则创建并设置,而closeSession()方法则负责关闭并移除当前线程的Session副本。 总结来说,ThreadLocal是Java中解决多线程数据隔离问题...

    理解threadlocal

    在这个例子中,我们定义了一个`ThreadLocal`对象`sequenceNumber`,并重写了`initialValue`方法来设置初始值为0。`getNext`方法每次被调用时都会为当前线程获取一个递增的序列号。 #### 六、总结 通过以上分析,...

    ThreadLocal源码分析和使用

    这样,当线程访问 ThreadLocal 变量时,实际上是访问的自己的副本,而不会影响其他线程的副本。 我们可以自己模拟 ThreadLocal,例如: ```java public class SimpleThreadLocal{ private Map valueMap=...

    Android 详解ThreadLocal及InheritableThreadLocal

    在这个例子中,主线程能够成功访问到mPerson,但在子线程中,尝试访问ThreadLocal的值时,会抛出NullPointerException,因为每个线程都有自己的ThreadLocal副本,主线程设置的值不会自动传递给子线程。 **...

    使用Java ThreadLocal.docx

    尽管它们共享同一个Runnable实例,但每个线程都会有自己的ThreadLocal副本,因此它们的`threadLocal`变量持有不同的值。 总之,Java的ThreadLocal类提供了一种安全、高效的方式,在多线程环境中为每个线程维护独立...

    深入理解ThreadLocal工作原理及使用示例

    ThreadLocal的主要作用是为每个使用该变量的线程提供独立的变量副本,使得每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。 ThreadLocal简介和使用示例 ThreadLocal只有一个无参的构造...

    ThreadLocal的原理,源码深度分析及使用.docx

    ThreadLocal 的使用可以通过一个简单的例子来演示。假设我们定义了一个静态的成员变量 num,然后通过构造 5 个线程对这个 num 做递增操作。运行结果可以看到,每个线程都会对这个成员变量做递增,如果线程的执行...

    ThreadLocal测试工程

    这个简单的例子展示了两个线程分别设置并打印ThreadLocal变量,它们不会相互影响。 7. **局限性**:ThreadLocal不适合跨线程通信,如果需要在多个线程间共享数据,应该考虑使用其他机制,如线程安全的数据结构或...

    java的ThreadLocal[整理].pdf

    在这个例子中,每个ThreadTest线程都有自己的thLocal和thLocal2变量,它们在各自的线程上下文中独立设置和获取值,互不影响。即使两个线程都调用了同一个ThreadLocal实例,它们所看到的值也是独立的,因为...

    Java 中ThreadLocal类详解

    由于每个线程有自己的ThreadLocal变量副本,所以不同线程的输出不会相互影响,展示了ThreadLocal的工作原理。 在Android的Looper类中,ThreadLocal同样发挥了关键作用。Looper类是用来管理消息循环的,每个线程通常...

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

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

    彻底理解Java 中的ThreadLocal

    在这个例子中,`seqNum`是一个ThreadLocal实例,它的`initialValue()`方法返回0,表示序列号的初始值。`getNextNum()`方法会获取当前线程的序列号副本,增加1后再保存回去,这样每个线程都会拥有自己独立的序列号...

    ThreadLocal使用案例_动力节点Java学院整理

    在Java中,每个线程都有自己的ThreadLocal变量副本,通过ThreadLocal可以实现线程安全的变量共享。本文主要介绍了ThreadLocal使用案例的分析,希望能够帮助读者更好地理解ThreadLocal的使用。 在本例中,我们需要...

    Java 并发编程之ThreadLocal详解及实例

    在这个例子中,`UniqueThreadIdGenerator` 类使用 `ThreadLocal` 来为每个线程生成唯一的 ID。`initialValue()` 方法会在每个线程首次访问 `uniqueNum` 时被调用,返回一个递增的 ID。 5. **注意事项** - 虽然 `...

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

    ThreadLocal是Java提供的一种线程局部变量,每个线程都拥有自己独立的ThreadLocal副本,互不影响。在上述代码中,创建了一个ThreadLocal实例,然后在线程的run()方法中设置值,每个线程设置的数据只对自己可见,...

Global site tag (gtag.js) - Google Analytics