導航:首頁 > 編程語言 > java中如何實現線程同步

java中如何實現線程同步

發布時間:2023-06-01 22:59:19

java中線程怎麼同步

1、使用線程類自帶的join方法,將子線程加入到主線程,在子線程執行完之後,在執行主線程邏輯。

例如

[java]view plain

  • publicstaticvoidcallableDemo()

  • throwsInterruptedException

  • {

  • System.out.println("=========TestwithCallable=====");

  • List<Callable<Integer>>callList=newArrayList<Callable<Integer>>();

  • ExecutorServiceexec=Executors.newFixedThreadPool(2);

  • //採用匿名內部類實現

  • callList.add(newCallable<Integer>()

  • {

  • publicIntegercall()

  • throwsException

  • {

  • System.out.println("SubWorkerworker1doworkbeginat"+sdf.format(newDate()));

  • newThreadWaitDemo().doSomeWork();//做實際工作

  • System.out.println(""

  • +sdf.format(newDate()));

  • return0;

  • }

  • });

  • callList.add(newCallable<Integer>()

  • {

  • publicIntegercall()

  • throwsException

  • {

  • System.out.println("SubWorkerworker2doworkbeginat"+sdf.format(newDate()));

  • newThreadWaitDemo().doSomeWork();//做實際工作

  • System.out.println(""

  • +sdf.format(newDate()));

  • return0;

  • }

  • });

  • exec.invokeAll(callList);

  • exec.shutdown();

  • doSuperWork();

  • }

  • 5、這種過於惡心,只簡單說一下方法,主線程創建一個線程List,將每個子線程保存到列表中,然後定期輪詢列表中子線程狀態,當所有線程都完成之後,再執行主線程邏輯
  • ⑵ JAVA中線程同步方法有哪些

    JAVA中線程同步的概念在同一個線程運行 前面的運行完在運行後面的 有先後順序 ,簡單的講就是版像排隊一樣有權先後順序。
    同步的方法有下面3種;
    1,wait方法:
    該方法屬於Object的方法,wait方法的作用是使得當前調用wait方法所在部分(代碼塊)的線程停止執行,並釋放當前獲得的調用wait所在的代碼塊的鎖,並在其他線程調用notify或者notifyAll方法時恢復到競爭鎖狀態(一旦獲得鎖就恢復執行)。
    2 notify方法和notifyAll方法:
    notify方法通知調用了wait方法,但是尚未激活的一個線程進入線程調度隊列(即進入鎖競爭),注意不是立即執行。並且具體是哪一個線程不能保證。另外一點就是被喚醒的這個線程一定是在等待wait所釋放的鎖。
    notifyAll方法則喚醒所有調用了wait方法,尚未激活的進程進入競爭隊列。
    3。 synchronized關鍵字:

    synchronized用來標識一個普通方法時,表示一個線程要執行該方法,必須取得該方法所在的對象的鎖。
    根據項目的需求,選擇有哪一種方法好一些。

    ⑶ 初學Java多線程:使用Synchronized塊同步方法

    synchronized關鍵字有兩種用法 第一種就是在《使用Synchronized關鍵字同步類方法》一文中所介紹的直接用在方法的定義中 另外一種就是synchronized塊 我們不僅可以通過synchronized塊來同步一個對象變數 也可以使用synchronized塊來同步類中的靜態方法和非靜態方法

    synchronized塊的語法如下

    public void method()

    {

    … …

    synchronized(表達式)

    {

    … …

    }

    }

    一 非靜態類方法的同步

    從《使用Synchronized關鍵字同步類方法》一文中我們知道使用synchronized關鍵字來定義方法就會鎖定類中所有使用synchronzied關鍵字定義的靜態方法或非靜態方法 但這並不好理解 而如果使用synchronized塊來達到同樣的效果 就不難理解為什麼會產生這種效果了 如果想使用synchronized塊來鎖定類中所有的同步非靜態方法 需要使用this做為synchronized塊的參數傳入synchronized塊國 代碼如下

    通過synchronized塊同步非靜態方法

    public class SyncBlock

    {

    public void method ()

    {

    synchronized(this) // 相當於對method 方法使用synchronized關鍵字

    {

    … …

    }

    }

    public void method ()

    {

    synchronized(this) // 相當於對method 方法使用synchronized關鍵字

    {

    … …

    }

    }

    public synchronized void method ()

    {

    … …

    }

    }

    在上面的代碼中的method 和method 方法中使用了synchronized塊 而第 行的method 方法仍然使用synchronized關鍵字來定義方法 在使用同一個SyncBlock類實例時 這三個方法只要有一個正在執行 其他兩個方法就會因未獲得同步鎖而被阻塞 在使用synchronized塊時要想達到和synchronized關鍵字同樣的效果 必須將所有的代碼都寫在synchronized塊中 否則 將無法使當前方法中的所有代碼和其他的方法同步

    除了使用this做為synchronized塊的參數外 還可以使用SyncBlock this作為synchronized塊的參數來達到同樣的效果

    在內類(InnerClass)的方法中使用synchronized塊來時 this只表示內類 和外類(OuterClass)沒有關系 但內類的非靜態方法可以和外類的非靜態方法同步 如在內類InnerClass中加一個method 方法 並使method 方法和SyncBlock的三個方法同步 代碼如下

    使內類的非靜態方法和外類的非靜態方法同步

    public class SyncBlock

    {

    … …

    class InnerClass

    {

    public void method ()

    {

    synchronized(SyncBlock this)

    {

    … …

    }

    }

    }

    … …

    }

    在上面SyncBlock類的新版本中 InnerClass類的method 方法和SyncBlock類的其他三個方法同步 因此 method method method 和method 四個方法在同一時間只能有一個方法執行

    Synchronized塊不管是正常執行完 還是因為程序出錯而異常退出synchronized塊 當前的synchronized塊所持有的同步鎖都會自動釋放 因此 在使用synchronized塊時不必擔心同步鎖的釋放問題

    二 靜態類方法的同步

    由於在調用靜態方法時 對象實例不一定被創建 因此 就不能使用this來同步靜態方法 而必須使用Class對象來同步靜態方法 代碼如下

    通過synchronized塊同步靜態方法

    public class StaticSyncBlock

    {

    public static void method ()

    {

    synchronized(StaticSyncBlock class)

    {

    … …

    }

    }

    public static synchronized void method ()

    {

    … …

    }

    }

    在同步靜態方法時可以使用類的靜態欄位class來得到Class對象 在上例中method 和method 方法同時只能有一個方法執行 除了使用class欄位得到Class對象外 還可以使用實例的getClass方法來得到Class對象 上例中的代碼可以修改如下

    使用getClass方法得到Class對象

    public class StaticSyncBlock

    {

    public static StaticSyncBlock instance;

    public StaticSyncBlock()

    {

    instance = this;

    }

    public static void method ()

    {

    synchronized(instance getClass())

    {

    }

    }

    }

    在上面代碼中通過一個public的靜態instance得到一個StaticSyncBlock類的實例 並通過這個實例的getClass方法得到了Class對象(一個類的所有實例通過getClass方法得到的都是同一個Class對象 因此 調用任何一個實例的getClass方法都可以) 我們還可以通過Class對象使不同類的靜態方法同步 如Test類的靜態方法method和StaticSyncBlock類的兩個靜態方法同步 代碼如下

    Test類的method方法和StaticSyncBlock類的method method 方法同步

    public class Test

    {

    public static void method()

    {

    synchronized(StaticSyncBlock class)

    {

    }

    }

    }

    lishixin/Article/program/Java/gj/201311/27374

    ⑷ Java線程同步的方法

    你們幾個回答我都沒看懂,同步就是synchronized,是讓所有的線程執行一個代碼回段之前排隊,一答個一個去執行這個代碼段。

    好像路邊的公共廁所,一間只能一個人上。外面不管有多少人排隊,裡面那個人出來,才能再進去一個人。

    ⑸ java 實現線程同步的方式有哪些

    實現同步機制有兩個方法:
    1、同步代碼塊:
    synchronized(同一個數據){} 同一個數據:就是N條線程同時訪問一個數據。
    2、同步方法:
    public synchronized 數據返回類型 方法名(){}
    就是使用 synchronized 來修飾某個方法,則該方法稱為同步方法。對於同步方法而言,無需顯示指定同步監視器,同步方法的同步監視器是 this 也就是該對象的本身(這里指的對象本身有點含糊,其實就是調用該同步方法的對象)通過使用同步方法,可非常方便的將某類變成線程安全的類,具有如下特徵:
    1,該類的對象可以被多個線程安全的訪問。
    2,每個線程調用該對象的任意方法之後,都將得到正確的結果。
    3,每個線程調用該對象的任意方法之後,該對象狀態依然保持合理狀態。
    註:synchronized關鍵字可以修飾方法,也可以修飾代碼塊,但不能修飾構造器,屬性等。
    實現同步機制注意以下幾點: 安全性高,性能低,在多線程用。性能高,安全性低,在單線程用。
    1,不要對線程安全類的所有方法都進行同步,只對那些會改變共享資源方法的進行同步。
    2,如果可變類有兩種運行環境,當線程環境和多線程環境則應該為該可變類提供兩種版本:線程安全版本和線程不安全版本(沒有同步方法和同步塊)。在單線程中環境中,使用線程不安全版本以保證性能,在多線程中使用線程安全版本.

    ⑹ Java類的實例化順序是什麼樣的Java線程同步的方式有哪些

    引言:java是在1990年初 ,被詹姆斯•高斯林等人開發的一門面向對象的編程語言。起初,java被稱為0ak,來經過發展0ak改名為java,與1995年的五月份正式向大家發布。

    一、java類的實例化順序

    java的實例化順序在繼承沒有的情況

    單獨一個類的場景下,初始化順序為依次為靜態數據,繼承的基類的構造函數,成員變數,被調用的構造函數。

    其中靜態數據只會初始化一次。(靜態數據包括靜態代碼塊和靜態變數,每個類的靜態數據只會初始化一次)

    在繼承的情況下

    添加兩個基類,讓繼承父親,父親繼承祖父。

    繼承的情況就比較復雜了。由繼承了基類,還將往上回溯,遞歸地調用基類的無參構造方法。

    在我們的例子中,在初始化靜態數據後,會先往上追溯,調用父的默認構造方法,此時再往上追溯到爺爺的默認構造方法。


    無論是java還是什麼別的東西他都體現了現代社會與信息技術的不斷發展,人們在進行進行技術開發時也有了越來越多的方法。程序類的工作也有了更為快捷的方法,這為信息技術的發展也提供了更好的發展方法

    閱讀全文

    與java中如何實現線程同步相關的資料

    熱點內容
    伊波拉病毒裡面的外國演員是誰 瀏覽:353
    借種女主角 瀏覽:142
    看電影不要錢的網址 瀏覽:426
    電影《戰國》演職表 瀏覽:857
    女主角叫雲舒的是哪一部小說 瀏覽:472
    天正電氣圖例在哪個文件夾裡面 瀏覽:138
    手機qq勛章館有什麼用 瀏覽:107
    jiuchai 瀏覽:840
    男男大尺度電影在線看 瀏覽:806
    沒有合法文件被上傳 瀏覽:382
    百度雲怎麼壓解文件 瀏覽:452
    國內精品影視推薦網站 瀏覽:481
    穿越民國做軍閥 瀏覽:446
    穿越到紅軍長征時期開超市 瀏覽:844
    帶女同學在閣樓看片是什麼電影 瀏覽:552
    三極鬼片完整版 瀏覽:665
    午夜香蕉大片 瀏覽:301
    華為s6506交換機配置文件 瀏覽:511
    有哪些出售門市信息網站 瀏覽:998
    html5和java 瀏覽:383

    友情鏈接