1. 程式人生 > >多線程-線程同步、異步

多線程-線程同步、異步

runnable rup () 使用 sys name 滿足 共享資源 .com

同步和異步

  同步和異步通常用來形容一次方法的調用。同步方法調用一旦開始,調用者必須完成所有的操作一直到方法調用結束,其他調用者才能繼續後續的行為,

異步方法調用類似一個消息傳遞,一旦開始,方法調用就會立即返回,其他調用者則可以無需等待,可以立即繼續後續的操作。

異步:

不過, 如果 我們 趕時髦, 就坐 在家 裏 打開 電腦, 在 網上 訂購 了 一臺 空調。 當你 完成 網上 支付 的 時候, 對 你來 說 購物 過程 已經 結束 了。 雖然 空調 還沒 送 到家, 但是 你的 任務 都已 經 完成 了。 商家 接到 了 你的 訂單 後, 就會 加緊 安排 送貨, 當然 這一 切 已經 跟你 無關 了。 你 已經 支付 完成, 想 幹什麽 就 能去 幹什麽, 出去 溜 幾 圈 都不 成問題, 等 送貨上門 的 時候, 接到 商家 的 電話, 回家 一 趟 簽收 就 完事 了。 這就 是 異步 調用。

public class MyThread3 {
    private synchronized void method1() {
        try {
            System.err.println("線程:" + Thread.currentThread().getName());
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    private
void metho2() { System.err.println("線程:" + Thread.currentThread().getName()); } public static void main(String[] agrs) { MyThread3 t = new MyThread3(); Thread a = new Thread(new Runnable() { @Override public void run() { t.method1(); } },
"t1"); Thread b = new Thread(new Runnable() { @Override public void run() { t.metho2(); } }, "t2"); a.start(); b.start(); } }

運行結果:

技術分享

同步:

打個 比方, 比如 我們 去 購物, 如果 你去 商場 實體 店 買 一臺 空調, 當你 到了 商場 看 中了 一 款 空調, 你就 想 售貨員 下單。 售貨員 去 倉庫 幫你 調配 物品。 這 天 你 熱得 實在 不行了, 就 催 著 商家 趕緊 給你 送貨, 於是 你就 等在 商 店裏, 候 著 他們, 直到 商家 把你 和 空調 一起 送 回家, 一次 愉快 的 購物 就 結束 了。 這就是 同步 調用。

/**
     * 同步:synchronized
     *      同步的概念就是共享,如果不是共享資源則沒必要進行同步;同步的目的是為了線程安全,線程安全只需要滿足該特性:原子性(同步)、可見性
     */

    private synchronized void metho2() {
        System.err.println("線程:" + Thread.currentThread().getName());
    }

運行結果:等待了2秒鐘

技術分享

  1.a線程先獲取了t對象的鎖,b線程可以異步訪問t對象的方法 metho2() 無 synchronized 修飾的方法。

  2.a線程獲取了t對象的鎖,b線程爭取去那t對象的鎖,這個時候對象使用同步 synchronized 修飾了metho2() 方法,a線程休眠了2秒,metho2() 方法的鎖還麽有釋放,2秒後,鎖被釋放了,a對象的操作全部結束;b線程這個時候才真正的拿到了t對象的鎖,去調用metho2() 方法。

多線程-線程同步、異步