知識のポイントを理解する:
強力な参照:オブジェクトへの参照を作成します
ソフトリファレンス:アプリケーションシナリオはキャッシュにあります
弱い参照:トランザクションのアプリケーションシナリオ
ファントムリファレンス:直接メモリ管理のアプリケーションシナリオ
ThreadLocalはスレッドの分離であり、各スレッドは互いに干渉しません
import java.util.concurrent.TimeUnit;
public class hacker_01_ThreadLocalDemo {
public static ThreadLocal<User> th=new ThreadLocal<>();
public static void main(String[] args) throws InterruptedException {
// 第一个线程
new Thread(new Runnable() {
@Override
public void run() {
User user = new User();
user.setName("小凯");
user.setAge(1);
// set user data
th.set(user);
// get user data
User getUser=th.get();
System.out.println("第一个线程:"+getUser);
}
}).start();
// wait second thread run
TimeUnit.MILLISECONDS.sleep(1000);
// 第二个线程
new Thread(new Runnable() {
@Override
public void run() {
// get user data
User user=th.get();
System.out.println("第二个线程:"+user);
}
}).start();
}
}
結果
結果グラフから、ThreadLocalには、このスレッドの内容にアクセスしてこのスレッドでのみ使用できるようにするための自然なスレッド分離メカニズムがあることがわかります。
ThreadLocalスレッドが分離される原因は何ですか?
ThreadLocalセットのソースコード
ThreadLocalMapを取得します。保存されたキーはThreadLocalオブジェクトであり、値は保存される値です。
ThreadLocalのgetMapソースコード
threadLocalsはThreadのメンバー変数であり、異なるスレッドのthreadLocalが異なることを保証します。
threadLocalsがnullの場合、createMapメソッドを呼び出します
上の図からわかるように、Entryオブジェクトはマップに格納され、Entryオブジェクトのキーは弱い参照タイプであり、値は強い参照タイプです。
弱い参照のタイプ。メモリ内のThreadLocalオブジェクトが空の場合、弱い参照はnullを指します。これにより、jvmのgcによるThreadLocaオブジェクトの再利用が容易になり、メモリリークが防止されます。