ThreadLocal入門
2456 ワード
ThreadLocalクラススレッドのローカル変数を表し、データをThreadLocalに配置することで、各スレッドに変数のコピーを作成し、同時アクセスのスレッドセキュリティの問題を回避できます.
ThreadLocalは同期メカニズムに代わるものではなく,両者が指向する問題領域が異なる.同期メカニズムは、複数のスレッドが同じリソースに対する同時アクセスを同期するためであり、複数のスレッド間で通信を行う有効な方法である.一方、ThreadLocalは、複数のスレッドのデータ共有を分離するため、複数のスレッド間の共有リソース(変数)の競合を根本的に回避し、複数のスレッドを同期させる必要がなくなります.
通常、複数のスレッド間でリソースを共有し、スレッド間の通信機能を達成するために、同期メカニズムを使用する必要があると考えられています.複数のスレッド間の共有競合のみを分離する必要がある場合は、ThreadLocalを使用します.
メモ:2つのスレッドは同じオブジェクトatを使用していますが、2つのスレッドでは互いに影響しません.2つのスレッドは2つの完全に同じコピーを使用しているため、現在のスレッドの内容を変更しても他のスレッドには影響しません.
構想:スレッドクラスを作成します.このクラスにはThreadLocalオブジェクトまたはThreadLocalを属性とするオブジェクトを含む属性があります.その後、スレッドを起動し、ThreadLocalから共有データを取得します.
実行結果:
---- huangbiao
nullアカウントのi値0
nullアカウントのi値1
nullアカウントのi値0
nullアカウントのi値1
nullアカウントのi値2
nullアカウントのi値3
nullアカウントのi値4
nullアカウントのi値5
スレッド2アカウントのi値6
スレッド2アカウントのi値7
スレッド2アカウントのi値8
スレッド2アカウントのi値9
nullアカウントのi値2
nullアカウントのi値3
nullアカウントのi値4
nullアカウントのi値5
スレッド1アカウントのi値6
スレッド1アカウントのi値7
スレッド1アカウントのi値8
スレッド1アカウントのi値9
ThreadLocalは同期メカニズムに代わるものではなく,両者が指向する問題領域が異なる.同期メカニズムは、複数のスレッドが同じリソースに対する同時アクセスを同期するためであり、複数のスレッド間で通信を行う有効な方法である.一方、ThreadLocalは、複数のスレッドのデータ共有を分離するため、複数のスレッド間の共有リソース(変数)の競合を根本的に回避し、複数のスレッドを同期させる必要がなくなります.
通常、複数のスレッド間でリソースを共有し、スレッド間の通信機能を達成するために、同期メカニズムを使用する必要があると考えられています.複数のスレッド間の共有競合のみを分離する必要がある場合は、ThreadLocalを使用します.
package hb.threadlocal;
public class Account {
private ThreadLocal<String> name = new ThreadLocal<String>();
public Account(String str){
this.name.set(str);
System.out.println("---- " + this.name.get());
}
public String getName() {
return name.get();
}
public void setName(String name) {
this.name.set(name);
}
}
package hb.threadlocal;
public class MyThread extends Thread {
private Account account;
public MyThread(Account account,String name){
super(name);
this.account = account;
}
public void run(){
for(int i=0;i<10;i++){
if(i==6){
account.setName(getName());
}
System.out.println(account.getName()+" i " + i);
}
}
}
package hb.threadlocal;
public class ThreadLocalTest {
public static void main(String[] args) {
Account at = new Account("huangbiao");
new MyThread(at," ").start();
new MyThread(at," ").start();
}
}
メモ:2つのスレッドは同じオブジェクトatを使用していますが、2つのスレッドでは互いに影響しません.2つのスレッドは2つの完全に同じコピーを使用しているため、現在のスレッドの内容を変更しても他のスレッドには影響しません.
構想:スレッドクラスを作成します.このクラスにはThreadLocalオブジェクトまたはThreadLocalを属性とするオブジェクトを含む属性があります.その後、スレッドを起動し、ThreadLocalから共有データを取得します.
実行結果:
---- huangbiao
nullアカウントのi値0
nullアカウントのi値1
nullアカウントのi値0
nullアカウントのi値1
nullアカウントのi値2
nullアカウントのi値3
nullアカウントのi値4
nullアカウントのi値5
スレッド2アカウントのi値6
スレッド2アカウントのi値7
スレッド2アカウントのi値8
スレッド2アカウントのi値9
nullアカウントのi値2
nullアカウントのi値3
nullアカウントのi値4
nullアカウントのi値5
スレッド1アカウントのi値6
スレッド1アカウントのi値7
スレッド1アカウントのi値8
スレッド1アカウントのi値9