天天看點

ThreadLocal線程局部變量-多線程與高并發

ThreadLocal線程局部變量,實作了将對象變量儲存在特定的線程對象中,僅對目前線程可見。

我們在測試程式中,一個線程往ThreadLocal對象中放置對象,然後另一個對象來取對象取不到。

public class TestThreadLocal {
	static ThreadLocal <Person> tl = new ThreadLocal<>();

	public static void main(String[] args) {
				
		new Thread(()->{
			try {
				TimeUnit.SECONDS.sleep(2);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			System.out.println(tl.get());
		}).start();
		
		new Thread(()->{
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			tl.set(new Person());
		}).start();
	}
	
	static class Person {
	}
}
           

檢視ThreadLocal源代碼,可以看到,get()和set()方法都涉及到一個ThreadLocalMap對象,而該對象是在Thread對象中的。

ThreadLocal線程局部變量-多線程與高并發
ThreadLocal線程局部變量-多線程與高并發
ThreadLocal線程局部變量-多線程與高并發

由以上代碼,可以看到,ThreadLocal實作的将對象變量儲存在特定的線程對象的map中,隻對目前線程可見。

應用:

資料庫連接配接

如果多個連接配接資料庫的方法組合為一個事務,則其對應的是統一資料庫的多個連接配接,則其不能保證事物的原子性。而ThreadLocal可以保證目前線程值對應這一個資料庫連接配接。

而且由于資料庫連接配接對象可以使用ThreadLocal存放,省去了不斷釋放和建立連接配接的系統消耗。

記憶體洩漏:

ThreadLocal線程局部變量-多線程與高并發