public class SequenceNumber {
// ①通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值
private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {
public Integer initialValue() {
return 0;
}
};
// ②获取下一个序列值
public int getNextNum() {
seqNum.set(seqNum.get() + 1);
return seqNum.get();
}
public static void main(String[] args) {
SequenceNumber sn = new SequenceNumber();
// ③ 3个线程共享sn,各自产生序列号
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++) {// ④每个线程打出3个序列值
System.out.println("thread[" + Thread.currentThread().getName()
+ "] sn[" + sn.getNextNum() + "]");
}
}
}
}
分享到:
相关推荐
ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。** ### ThreadLocal基本使用 创建ThreadLocal实例...
本例以序列号生成的程序为例,展示ThreadLocal的使用
例如,我们可以创建一个ThreadLocal变量来保存每个线程的JDBC连接,这样每个线程都有自己独立的连接,避免了连接的共享和线程安全问题。下面是一个ThreadLocal的简单应用示例: ```java public class ...
数据库连接是一个经典的例子。在没有使用连接池的原始JDBC方式中,每次通过DriverManager.getConnection()获得的连接都对应一个事务,而这种方式在高并发情况下会造成性能瓶颈。为了解决这个问题,通常会使用数据库...
ThreadLocal 源码分析和使用 ThreadLocal 是 Java 语言中的一种多线程编程机制,用于...在这个例子中,我们使用 ThreadLocal 来实现一个序列号生成器,每个线程都可以独立地生成序列号,而不会受到其他线程的影响。
让我们通过一个简单的例子来理解`ThreadLocal`的工作机制: ```java public class ThreadLocalExample { private static ThreadLocal<Integer> threadLocal = new ThreadLocal(); public static void main...
在这个例子中,我们定义了一个`ThreadLocal`对象`sequenceNumber`,并重写了`initialValue`方法来设置初始值为0。`getNext`方法每次被调用时都会为当前线程获取一个递增的序列号。 #### 六、总结 通过以上分析,...
ThreadLocal并不是一个线程对象,而是线程局部变量,即threadlocalvariable,它的主要作用是确保每个线程都有自己的变量实例,互不干扰。 ### 一、ThreadLocal工作原理 ThreadLocal通过内部的Map存储每个线程的...
在Android中,ThreadLocal常被用来存储线程相关的数据,例如Handler中的Looper对象,因为Looper与线程紧密关联,每个线程通常只有一个Looper,而ThreadLocal正好满足这种需求。 下面是一个简单的ThreadLocal使用...
Java中的ThreadLocal是一个非常有用的工具类,它提供了一种线程局部变量的机制。线程局部变量(ThreadLocal)的特点是每个线程都有其独立的副本,这些副本之间互不干扰,即使它们共享同一个ThreadLocal实例。这使得...
ThreadLocal 的使用可以通过一个简单的例子来演示。假设我们定义了一个静态的成员变量 num,然后通过构造 5 个线程对这个 num 做递增操作。运行结果可以看到,每个线程都会对这个成员变量做递增,如果线程的执行...
首先,当我们创建一个ThreadLocal对象时,ThreadLocal将为每个线程提供一个独立的变量副本。 当我们调用get方法时,ThreadLocal将返回当前线程的变量副本。 当我们调用set方法时,ThreadLocal将设置当前线程的变量...
ThreadLocalMap是ThreadLocal的一个内部类,它是一个自定义的哈希映射,特别适合存储线程局部变量。ThreadLocalMap并不直接继承自java.util.Map,而是使用WeakReference来保存ThreadLocal实例作为键。这样做的好处是...
ThreadLocal是Java编程语言中的一个线程局部变量类,它为每个线程提供了一个独立的变量副本,使得每个线程可以独立地改变自己的副本,而不会影响其他线程所对应的副本。这个特性在多线程编程中非常有用,能够帮助...
在这个例子中,`ThreadLocalTest`类中的`threadLocal`变量为每个线程初始化一个随机值,并且`increament()`方法会增加当前线程的`ThreadLocal`变量的值。由于每个线程都有自己的副本,因此不会发生数据竞争。 总结...
其实,它就是一个容器,用于存放线程的局部变量,我认为应该叫做 ThreadLocalVariable(线程局部变量)才对,真不理解为什么当初 Sun 公司的工程师这样命名。 早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了...
在这个例子中,`SequenceNumber`类有一个`ThreadLocal<Integer>`成员变量`seqNum`,并重写了`initialValue()`方法初始化为0。`getNextNum()`方法用于获取并递增序列号。`TestClient`线程类会打印出各自线程的序列号...
在这个例子中,随机生成一个0到10000之间的整数作为初始值。 `Accessor`类实现了Runnable接口,每个线程执行`run`方法时会调用`ThreadLocalVariableHolder.increment()`来增加变量的值,然后打印出来。由于每个线程...
ThreadLocal是一个非常有用的多线程机制,可以帮助我们实现线程安全的变量共享。但是,我们需要小心地使用ThreadLocal,以避免可能出现的问题。 在本例中,我们使用ThreadLocal来记录操作日志,以便在多线程环境中...
在这个例子中,`seqNum`是一个ThreadLocal实例,它的`initialValue()`方法返回0,表示序列号的初始值。`getNextNum()`方法会获取当前线程的序列号副本,增加1后再保存回去,这样每个线程都会拥有自己独立的序列号...