<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                http://blog.csdn.net/iktz_cn/article/details/50118695 通過ThreadLoad實現線程范圍內的共享變量 線程共享變量可能出現的問題 ![](https://box.kancloud.cn/86fd13693a6cfcf9c6ffd53c6533f419_1282x818.png) 使用ThreadLocal來避免共享變量的并發問題 ![](https://box.kancloud.cn/1afcd1599906b22bceff4b61295a80c4_1354x820.png) 實例代碼 ~~~ package cn.iktz.thread.demo; import java.util.Random; public class ThreadLocalTest2 { public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new ThreadLocalTestSetData()).start(); } } } class Object1 { public void get(ThreadLocal<Integer> x) { System.out.println("A from " + Thread.currentThread().getName() + " get data :" + x.get()); } } class ThreadLocalTestSetData implements Runnable { private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(); @Override public void run() { int data = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + " has put data :" + data); threadLocal.set(data);// threadLocl用來存儲數據,存儲的數據與當前線程有關的而非全局的 MyThreadScopeData.getThreadInstance().setName("name" + data); MyThreadScopeData.getThreadInstance().setAge(data); new Object1().get(threadLocal); } } ~~~ 對ThreadLocal進行封裝 ~~~ package cn.iktz.thread.demo; import java.util.Random; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ThreadLocalTest3 { public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable() { @Override public void run() { int data = new Random().nextInt(); System.out.println(Thread.currentThread().getName() + " has put data :" + data); MyThreadScopeData.getThreadInstance().setName("name" + data); MyThreadScopeData.getThreadInstance().setAge(data); new A().get(); } }).start(); } } static class A { public void get() { MyThreadScopeData myData = MyThreadScopeData.getThreadInstance(); System.out.println("A from " + Thread.currentThread().getName() + " getMyData: " + myData.getName() + "," + myData.getAge()); } } static class MyThreadScopeData { private MyThreadScopeData() { } static Lock lock = new ReentrantLock(); public static MyThreadScopeData getThreadInstance() { lock.lock(); try { MyThreadScopeData instance = map.get(); if (instance == null) { instance = new MyThreadScopeData(); /** 這里可能會出現并發問題,所以要加鎖。 這里如果a線程創建了對象,并賦值,此時instance指向0X6666, 然后b來了get為null,也會創建一個對象并賦值,此時instance指向0x7777,0x6666被覆蓋 b線程放入了0x7777的對象,此時切換到a線程,a也會放入0x7777的對象,則出現并發問題 */ map.set(instance); } return instance; } finally{ lock.unlock(); } } private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>(); private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } } ~~~ 線程退出時清空該線程ThreadLocal的數據,看api可以知道,gc線程,會回收只被ThreadLocal引用的對象
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看