专业的JAVA编程教程与资源

网站首页 > java教程 正文

java本地线程ThreadLocal

temp10 2024-11-24 21:56:45 java教程 14 ℃ 0 评论

ThreadLocal实例代表一个线程局部变量,每条线程都只能看到自己的值。当多个线程并发修改某个竞争资源,就会导致线程安全问题。

ThreadLocal 保证线程安全的原理与 synchronized不一样使用场景 ThreadLocal 线程局部变量,它会把竞争资源,针对每个线程复制一个副本.每个线程要修改竞争资源时,其实是修改自己拥有的副本。

java本地线程ThreadLocal

public class SequenceNum {
	/*
	 * 通过ThreadLocal让每个线程操作自己独立的副本,在没有使用ThreadLocal的时候,三个线程都在操作同一份资源(i)
	 * 如果希望让三个线程操作各自的副本,类似克隆 3个i出来,可以通过java提供的类ThreadLocal来实现
	 * */
	ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
	//定义静态成员变量
	static Integer i;
	//定义实例方法,每次调用该实例方法  i的值都会自增
	public Integer getNextNum() {
		//从 ThreadLocal 中 获取每个线程各自的副本
		 i = threadLocal.get();
		 if(i == null)
			 i = 0;
		i++;
		//将i的值存放在   threadLocal 中
		threadLocal.set(i);
		return i;
	}
}
public class ThreadTest extends Thread{
	private SequenceNum sequenceNum;
	public ThreadTest(SequenceNum sequenceNum) {
		super();
		this.sequenceNum = sequenceNum;
	}
	@Override
	public void run() {
		for (int i = 0; i < 3; i++) {
			System.out.println("当前线程名:"+this.getName()+"   ---i:"+i+":nextNum:"+sequenceNum.getNextNum());
		}
	}
}
测试
//创建SequenceNum实例
		SequenceNum sequenceNum = new SequenceNum();
		//模拟多个线程
		ThreadTest threadTest01 = new ThreadTest(sequenceNum);
		threadTest01.setName("线程1");
		ThreadTest threadTest02 = new ThreadTest(sequenceNum);
		threadTest02.setName("线程2");
		ThreadTest threadTest03 = new ThreadTest(sequenceNum);
		threadTest03.setName("线程3");
		//让3个线程就绪
		threadTest01.start();
		threadTest02.start();
		threadTest03.start();

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表