java线程之ThreadLocal

本文深入探讨了ThreadLocal的概念及其在多线程编程中的使用方法,通过实例展示了如何确保每个线程拥有独立的共享资源,从而实现线程间的隔离与互不影响。重点介绍了ThreadLocal如何在不改变全局变量的情况下,为每个线程提供专属的资源,适用于需要维护线程间数据独立性的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ThreadLocal是指某线程的局部变量。用法如下:

package com.concurrent;

import junit.framework.TestCase;

public class TestThreadLocal extends TestCase {

	public void testThreadLocal1() {
		SharedResource sharedResource = new SharedResource();
		for (int i = 0; i < 3; i++) {
			TestThread t = new TestThread(sharedResource);
			t.start();
		}
	}
	
	public void testThreadLocal2() {
		for (int i = 0; i < 3; i++) {
			SharedResource sharedResource = new SharedResource();
			TestThread t = new TestThread(sharedResource);
			t.start();
		}
	}
	
	public void testThreadLocal3() {
		SharedResource sharedResource = new ThreadLocalSharedResource();
		for (int i = 0; i < 3; i++) {
			TestThread t = new TestThread(sharedResource);
			t.start();
		}
	}

	static class SharedResource {
		private int count = 0;

		public int getCount() {
			return count++;
		}
	}
	
	static class ThreadLocalSharedResource extends SharedResource {
		private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {

			@Override
			protected Integer initialValue() {
				return 0;
			}
			
		};

		@Override
		public int getCount() {
			int oldValue = threadLocal.get();
			int newValue = oldValue + 1;
			threadLocal.set(newValue);
			return oldValue;
		}
		
		
	}

	static class TestThread extends Thread {

		private SharedResource sharedResource;

		TestThread(SharedResource sharedResource) {
			this.sharedResource = sharedResource;
		}

		@Override
		public void run() {
			for (int i = 0; i < 3; i++) {
				System.out.println(Thread.currentThread() + ", " + sharedResource.getCount());
			}
		}

	}
}

运行testThreadLocal1,输出:

Thread[Thread-0,5,main], 0
Thread[Thread-0,5,main], 1
Thread[Thread-0,5,main], 2
Thread[Thread-1,5,main], 3
Thread[Thread-1,5,main], 4
Thread[Thread-1,5,main], 5
Thread[Thread-2,5,main], 6
Thread[Thread-2,5,main], 7
Thread[Thread-2,5,main], 8

一个共享资源,三个线程共享。

如果要的结果是每个线程只会输出0,1,2,那可以new三个共享资源,也就是testThreadLocal2,输出结果:

Thread[Thread-0,5,main], 0
Thread[Thread-0,5,main], 1
Thread[Thread-0,5,main], 2
Thread[Thread-2,5,main], 0
Thread[Thread-2,5,main], 1
Thread[Thread-2,5,main], 2
Thread[Thread-1,5,main], 0
Thread[Thread-1,5,main], 1
Thread[Thread-1,5,main], 2

但是,共享资源一般只有一个,那怎么保证上面的输出呢?那就要用到ThreadLocal了,运行testThreadLocal3:

Thread[Thread-0,5,main], 0
Thread[Thread-0,5,main], 1
Thread[Thread-0,5,main], 2
Thread[Thread-2,5,main], 0
Thread[Thread-2,5,main], 1
Thread[Thread-2,5,main], 2
Thread[Thread-1,5,main], 0
Thread[Thread-1,5,main], 1
Thread[Thread-1,5,main], 2

ThreadLocal保证每个线程里的共享资源都是独立的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值