public class SequenceNumber {
private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {
public Integer initialValue() {
/*
* 对每一个线程来说这里都是new Integer(1000),是不同的对象
* 这样才做到ThreadLocal每个线程保存自己的变量
*/
return 1000; // -128 to 127 有缓存的
}
};
public int getNextNum() {
Integer a = seqNum.get();
seqNum.set(seqNum.get() + 0);
/*
* +1可以看到各个线程产生的各自产生数字
*/
//seqNum.set(seqNum.get() + 1);
//全部都是false
System.out.println(a==seqNum.get());//false
return seqNum.get();
}
public static void main(String[] args)
{
SequenceNumber sn = new SequenceNumber();
TestClient t1 = new TestClient(sn);
TestClient t2 = new TestClient(sn);
TestClient t3 = new TestClient(sn);
t1.start();
t2.start();
t3.start();
}
private static class TestClient extends Thread
{
private SequenceNumber sn;
public TestClient(SequenceNumber sn) {
this.sn = sn;
}
public void run()
{
for (int i = 0; i < 3; i++) {
System.out.println("thread[" + Thread.currentThread().getName()
+
"] sn[" + sn.getNextNum() + "]");
}
}
}
}
分享到:
相关推荐
**线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...
2. 使用`set`方法设置线程局部变量的初始值。 3. 在需要访问该变量的线程中,通过`get`方法获取变量副本。 4. 当不再需要使用ThreadLocal时,建议清除线程局部变量,防止内存泄漏。可以调用`remove`方法来实现。 ...
在 `LeakingServlet` 的 `doGet` 方法中,如果 `ThreadLocal` 没有设置值,那么会创建一个新的 `MyCounter` 并设置到 `ThreadLocal` 中。关键在于,一旦 `MyCounter` 被设置到 `ThreadLocal`,那么它将与当前线程...
同时, ThreadLocal 还提供了扩容机制,当数组的 size 大于总长度的 2/3 时,会触发扩容操作,扩容后将原来的数组长度乘以 2倍。 在 ThreadLocal 中,set 方法的逻辑是先获取当前线程的存取副本变量的 map,然后...
2. **事务处理**:在事务管理中,`ThreadLocal`可以用于维护每个线程的事务状态,确保事务的完整性和一致性。 3. **日志记录**:在多线程环境中,`ThreadLocal`可以用于维护每个线程的日志上下文,如线程ID、用户名...
例如,在分布式服务中,可能会使用分布式事务解决方案如两阶段提交(2PC)、补偿事务(TCC)等,而ThreadLocal则可以辅助管理这些分布式事务的状态。 总结一下,Java事务和ThreadLocal都是Java多线程编程中不可或缺...
2. **expungeStaleEntry方法**:当`ThreadLocal`对象被垃圾回收后,`ThreadLocalMap`中的相应条目将变为无效。`ThreadLocal`提供了一个`expungeStaleEntry`方法来清理这些无效条目,确保不会发生内存泄漏。 #### 五...
Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...
2. **内部类ThreadLocalMap**: `ThreadLocalMap`是`ThreadLocal`类中的一个内部静态类,它是一个定制的哈希映射,专门用于存储线程局部变量。每个`Thread`对象都包含一个`ThreadLocalMap`实例,用于保存该线程的`...
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
2. 存放上下文变量:如WebWork的ActionContext,它可以保存请求处理过程中的各种上下文信息,如动作对象、请求参数等。 3. 存储数据库会话:在Spring Hibernate ORM中,ThreadLocal常用来保存数据库连接的Session,...
### 2. ThreadLocal的应用场景 ThreadLocal常用于以下场景: - **线程安全的配置对象**:在多层架构中,如Spring框架中,可以使用ThreadLocal来存储线程相关的配置信息,如数据库连接、事务管理等,确保这些对象...
本资料主要聚焦于两种设计模式以及Java中的ThreadLocal特性。 首先,我们来探讨单例模式。单例模式是一种确保一个类只有一个实例,并提供全局访问点的设计模式。在Java中,通常通过私有构造函数、静态工厂方法或...
2. **为什么使用ThreadLocal管理Session?** 在传统的多线程Web应用中,由于多个线程可能会处理同一个请求,如果直接在全局变量中存储session信息,可能会导致线程安全问题。而ThreadLocal提供了一个线程局部的存储...
2. **避免null值**:不要将ThreadLocal设置为null,否则可能导致清理困难。 3. **谨慎使用全局ThreadLocal**:全局的ThreadLocal变量可能导致数据在不同线程间意外共享,应谨慎使用。 4. **注意线程池中的...
2. 并发编程:ThreadLocal是解决并发问题的一种策略,它提供了一种避免共享状态的方式,减少了锁的使用。 3. 内存管理:了解Java的内存模型和垃圾回收机制,才能理解ThreadLocal的内存泄漏风险和弱引用的作用。 4. ...
private static final ThreadLocal<Connection> connectionHolder = new ThreadLocal(); public static void setConnection(Connection conn) { connectionHolder.set(conn); } public static Connection get...