摘要:一個線程做完,并將數據刷新回主內存了,下一個線程才會啟動。聲明了的變量在被賦值之后,線程會立刻將值寫回主內存在讀取變量時,線程會到主內存去讀取變量的最新值。
一個例子:
public class Counter { public static int count = 0; public synchronized static void inc() { count++; } public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(new Runnable() { @Override public void run() { Counter.inc(); } }).start(); } while(Thread.activeCount() > 1){ Thread.yield(); } System.out.println("運行結果:Counter.count=" + Counter.count); } }
使用線程:
1.新建自定義類,繼承接口Runnable,并實現方法run()。
2.實例化,作為參數傳給thread(),調用thread的start方法,運行線程。該線程就會運行run()的代碼。
本來,main方法執行過程便是一個線程,就好比一個人A在干活。新建一個線程,就好比又召集了一個人來同時干活。上面的例子中,這新來的人——新建的線程——將會和A一起同時地干活。
所以,如果不在main線程里判斷其他100個線程是否允許完畢的話,A(main函數所在線程)可能將會比其他人有些人干的更快,那么——main函數的線程先于其他線程跑完,導致打印的結果不是最終100個線程跑完的結果。
synchronized關鍵字聲明了該方法為同步方法。意即,同時只允許一個線程運行這個方法。前面我們說過,新建并啟動了100個線程,這100個人都準備開始干活,但是帶有synchronized關鍵字的方法只允許同時一個人使用。也就是說這100個人需要排隊等待,先來后到。
為什么要同步,先來后到呢?
這里就存在內存使用的問題。
每一個線程在使用實例變量的時候,會復制一份副本到自己的棧內存中(每個線程獨自享有)。倘若實例變量為5,現有兩個線程同時復制了5到自己的線程內存。他們各自做加1操作,隨后線程A將結果6,寫回到主內存中;隨后線程B也將6寫回到主內存中。
但是我們的初衷可能是需要該變量作為計數器,反映所做操作的次數,但是這里兩個線程共做了2次操作,變量的值卻只加了1。
這個時候,使用synchronized,方法就會“同步”。一個線程做完,并將數據刷新回主內存了,下一個線程才會啟動。
就好比,房子里有一個房間,想進入的人必須拿到門口的桌子上放著的一把鑰匙,沒有鑰匙的人只可在門外等候。只有等這個人做完所有工作,并且把鑰匙還回門口的桌子,下一個人才能從桌子拿到鑰匙,進入房間。
volatile
Java還提供了關鍵字volatile。聲明了volatile的變量在被賦值之后,線程會立刻將值寫回主內存;在讀取變量時,線程會到主內存去讀取變量的最新值。說白了,它增加了線程與主內存的通信,以期望解決多線程寫數據的同步問題。
但這也并不一定能保證上述計數器的問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66407.html
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
摘要:最近聽很多面試的小伙伴說,網上往往是一篇一篇的多線程的文章,除了書籍沒有什么學習多線程的一系列文章。將此線程標記為線程或用戶線程。 最近聽很多面試的小伙伴說,網上往往是一篇一篇的Java多線程的文章,除了書籍沒有什么學習多線程的一系列文章。但是僅僅憑借一兩篇文章很難對多線程有系統的學習,而且面試的時候多線程這方面的知識往往也是考察的重點,所以考慮之下決定寫一系列關于Java多線程的文章...
摘要:我的學習筆記匯總標簽筆記分為兩大部分和筆記內容主要是對一些基礎特性和編程細節進行總結整理,適合了解基礎語法,想進一步深入學習的人如果覺得不錯,請給,這也是對我的鼓勵,有什么意見歡迎留言反饋目錄基礎鞏固筆記反射基礎鞏固筆記泛型基礎鞏 我的java&javaweb學習筆記(匯總) 標簽: java [TOC] 筆記分為兩大部分:javase和javaweb javase javawe...
摘要:包含了支持服務開發的類,并為提供基礎,如語言基礎操作操作網絡通信以及多線程等技術。在運行文件時,的解釋器對這些字節碼進行解釋執行,執行過程中需要加入的類在連接階段被載入到運行環境中。支持多個線程同時執行,并提供多線程之間的同步機制。 1.什么是Java語言 簡單地說,Java 是由 Sun Microsystems 公司于 1995 年推出的一門面向對象程序設計語言。2009 年 Or...
閱讀 1660·2021-09-28 09:35
閱讀 1131·2019-08-30 15:54
閱讀 1657·2019-08-30 15:44
閱讀 3363·2019-08-30 14:09
閱讀 488·2019-08-29 14:05
閱讀 2662·2019-08-28 17:53
閱讀 1978·2019-08-26 13:41
閱讀 1710·2019-08-26 13:26