java實現關鍵詞云_Java synchronized 關鍵詞詳細說明

Java synchronized 關鍵詞詳細說明

外置專業技能點系統進程和進程的定義

進程建立方法

進程的情況情況變換

線程安全的定義

synchronized 關鍵詞的幾類使用方法裝飾非靜態數據組員方式synchronized?public?void?sync(){

}

裝飾靜態數據組員方式synchronized?public?static?void?sync(){

}

類鎖編碼塊synchronized?(類.class){

}

目標鎖編碼塊synchronized?(this|目標){

}

synchronized 裝飾非靜態方法時能夠看作是鎖 this 目標,裝飾靜態方法時能夠看作是鎖方式所屬的類。

synchronized 關鍵詞的壓根體制

每個進程要想瀏覽被 synchronized 裝飾的編碼塊,還要獲得 synchronized 申明的鎖。假如2個進程的總體目標是同一個鎖,就會出現堵塞的狀況,因此2個進程不可以另外瀏覽同一個鎖下的編碼,確保了c#多線程在實行時最后結果不容易錯誤。這與共享資源自變量是不是為靜態數據不相干。

好多個事例

目標鎖public?class?ThreadDemo?extends?Thread?{

@Override

public?synchronized?void?run()?{

for?(int?i?=?0;?i?

Main.i++;

}

System.out.println("實行進行");

}

}

立即將承繼的 run() 方式標識為 synchronized ,功效是對 Main 類中的 i 自變量做 10000 次累積實際操作。public?class?Main?{

static?int?i?=?0;

public?static?void?main(String[]?args)?throws?InterruptedException?{

ThreadDemo?threadDemo=new?ThreadDemo();

Thread?t1?=?new?Thread(threadDemo);

Thread?t2?=?new?Thread(threadDemo);

Thread?t3?=?new?Thread(threadDemo);

Thread?t4?=?new?Thread(threadDemo);

t1.start();

t2.start();

t3.start();

t4.start();

t1.join();

t2.join();

t3.join();

t4.join();

System.out.println(i);

}

}

//輸出結果:

//實行進行

//實行進行

//實行進行

//實行進行

//40000

能夠看見當4個進程所有實行結束以后,自變量 i 取得成功的累積了 40000 次,沒有出現遺失實際操作的狀況。

假如人們將 main() 方式改動以下:public?static?void?main(String[]?args)?throws?InterruptedException?{

Thread?t1?=?new?ThreadDemo();

Thread?t2?=?new?ThreadDemo();

Thread?t3?=?new?ThreadDemo();

Thread?t4?=?new?ThreadDemo();

t1.start();

t2.start();

t3.start();

t4.start();

t1.join();

t2.join();

t3.join();

t4.join();

System.out.println(i);

}

//輸出結果:

//實行進行

//實行進行

//實行進行

//實行進行

//27579

能夠看見遺失了許多的累積實際操作。觀查前后左右2個 main() 方式建立進程的方法能夠發覺,前邊的 main() 方式是應用了同一個目標來建立了4個不一樣的進程,然后一個 main() 方式應用了4個不一樣的 ThreadDemo 目標建立了4個進程。人們用 synchronized 裝飾的是一個非靜態數據友元函數,等于對該方式建立了 this 的目標鎖。在第一個 main() 方式中應用同一個目標來建立 4 個不一樣進程就會讓 4 個進程角逐同一個目標鎖,那樣,在同一時間內,僅能有一個進程能瀏覽 synchronized 裝飾的方式。而在第二種 main() 方式中,4 個進程分別相匹配一個目標鎖,4 個進程中間沒有市場競爭關聯,目標鎖當然沒法起效。

類鎖public?class?ThreadDemo?extends?Thread?{

@Override

public?void?run()?{

synchronized?(ThreadDemo.class)?{

for?(int?i?=?0;?i?

Main.i++;

}

System.out.println("實行進行");

}

}

}

將裝飾方式的 synchronized 改成對 ThreadDemo.class 鎖上的編碼塊public?class?ThreadDemo2?extends?Thread?{

@Override

public?void?run()?{

synchronized?(ThreadDemo2.class)?{

for?(int?i?=?0;?i?

Main.i++;

}

System.out.println("實行進行");

}

}

}

再建立一個同樣的類取名為 ThreadDemo2 ,與 ThreadDemo 不一樣的是,ThreadDemo2 中,synchronized 對 ThreadDemo2.class 鎖上。public?static?void?main(String[]?args)?throws?InterruptedException?{

Thread?t1?=?new?ThreadDemo();

Thread?t2?=?new?ThreadDemo();

Thread?t3?=?new?ThreadDemo2();

Thread?t4?=?new?ThreadDemo2();

t1.start();

t2.start();

t3.start();

t4.start();

t1.join();

t2.join();

t3.join();

t4.join();

System.out.println(i);

}

//輸出結果:

//實行進行

//實行進行

//實行進行

//實行進行

//33054

4 個進程各自由 ThreadDemo 和 ThreadDemo2 來建立,顯而易見獲得的結果與預估的 40000 不符合。假如人們將 ThreadDemo2 中的 synchronized 改成對 ThreadDemo.class 鎖上:public?class?ThreadDemo2?extends?Thread?{

@Override

public?void?run()?{

synchronized?(ThreadDemo.class)?{

for?(int?i?=?0;?i?

Main.i++;

}

System.out.println("實行進行");

}

}

}

//輸出結果:

//實行進行

//實行進行

//實行進行

//實行進行

//40000

能夠看見,盡管是申明在2個不一樣的類中的 synchronized 編碼塊,可是因為全是對 ThreadDemo.class 鎖上,因此 4 個進程中間還是創建了市場競爭關聯,另外只有有一個進程瀏覽被 synchronized 裝飾的編碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281791.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

損失函數(Loss function) 和 代價函數(Cost function)

1損失函數和代價函數的區別: 損失函數(Loss function):指單個訓練樣本進行預測的結果與實際結果的誤差。 代價函數(Cost function):整個訓練集,所有樣本誤差總和(所有損失函數總和)的平均值。(這一步體現在propagate()…

Hadoop/HDFS命令

Hadoop中文手冊:http://hadoop.apache.org/docs/r1.0.4/cn/commands_manual.html 英文手冊:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/CommandsManual.html Hadoop fs命令 hadoop fs: 該命令可以用于其他文件系統&#x…

《Node.js 入門系列》—— 一些簡單的排錯方法(一)

目錄 TypeError: undefined is not a functionTypeError: Cannot read property xxx of undefined 或者 TypeError: Cannot read property xxx of null檢查變量是未賦值檢查函數是否有返回值檢查變量是否引用了某個對象不存在的屬性檢查調用函數時是否未該傳遞參數俗話說“常在…

內置IOC容器ServiceCollection

.NetCore內置IOC容器ServiceCollection一、IOC介紹IOC:全名(Inversion of Control)-控制反轉IOC意味著我們將對象的創建控制權交給了外部容器,我們不管它是如何創建的,我們只需要知道,當我們想要某個實例時,我們可以直…

java中 有沒有方法將瀏覽器標簽欄去掉_用JS去掉IE窗口的標題欄,工具欄,地址欄...

前言:經常上網的朋友可能會到過這樣一些網站,一進入首頁立刻會彈出一個窗口,或者按一個連接或按鈕彈出,通常在這個窗口里會顯示一些注意事項、版權信息 、警告、歡迎光顧之類的話或者作者想要特別提示的信息。其實制作這樣的頁面效果非常的容…

React+Redux仿Web追書神器

引言 由于 10 月份做的 React Native 項目沒有使用到 Redux 等庫,寫了一段時間想深入學習 React,有個想法想做個 demo 練手下,那時候其實還沒想好要做哪一個類型的,也看了些動漫的,小說閱讀,聚合資源的開源…

【算法】LeetCode算法題-Maximum Subarray

這是悅樂書的第154次更新,第156篇原創 01 看題和準備 今天介紹的是LeetCode算法題中Easy級別的第13題(順位題號是53)。給定一個整數數組nums,找出一個最大和,此和是由數組中索引連續的元素組成,至少包含一個…

windows配置solr5.5.2(不通過tomcat,使用內置jetty)

一、windows下配置solr5.5.2(不通過tomcat,使用內置jetty) 第一步:安裝Jdk1.7 Solr5.5好像只支持Jdk1.7及以上的版本,沒親測,solr6.0是只支持jdk1.8及以上的,下圖為啟動solr時的截圖: 如何在windows環境下配置jdk及驗證…

java起源英文_Abbreviation 英文詞組縮寫(來源:南陽理工大學ACM)java

As we know, we often use a short sequence of characters in place of some words with a very long name. For example, ACM is an abbreviation of “Association for Computing Machinery”. Now we are using an acronymic method to get the abbreviation. An acronym i…

【C# Personal Handbook】運行環境

一、CLR、CLI、CTS、CLS、BCL、FCL簡介CLI(公共語言基礎)CLI是微軟公司向ECMA提交的一份語言和數據格式規范,CLR是目前為止唯一一個公共語言基礎的實現版本。CLI包括了公共類型系統(CTS)、公共中間語言(CIL…

如何完善自己的知識結構

★領域 (本來想用“學科”這個詞,后來覺得“學科”的范疇還是偏小,就改用“領域”)  按照傳統的習慣,通常會把知識歸類到不同的領域(比如:文學、數學、計算機、烹調、等等)。 ◇領…

MATLAB編程與應用系列-關于MATLAB編程入門教程的總體編寫安排

本系列教程來源于出版設計《基于MATLAB編程基礎與典型應用書籍》,如涉及版權問題,請聯系:156204968qq.com。 出版社:人民郵電出版社, 頁數:525。 本系列教程目前基于MATLABR2006a,可能對于更高級…

python語言特性-------python2.7教程學習【廖雪峰版】(一)

開始學習廖雪峰的py2.7教程: 2017年6月5日12:54:28 筆記: 廖雪峰python2.7教程1.用任何編程語言來開發程序,都是為了讓計算機干活。 2.Python是一種相當高級的語言。代碼少還不好?代碼少的代價是運行速度慢。3.用Python可以做什么…

java調c++代碼_Java中調用C++代碼的實現 | 學步園

JNI為 Java Native Interface 即Java本地接口,使用此種方式可以對C/C代碼進行調用,其在本質上是對C/C生成的動態庫進行調用而不是直接對C/C代碼進行調用Java代碼如下:public class TestJNI{//JNI在本質上是調用C/C的動態庫來實現的&#xff…

jeesite1.X 集成多數據源

2019獨角獸企業重金招聘Python工程師標準>>> 網上看了幾個例子,都是相同數據源的動態切換,如果不是同一種數據庫類型,分頁查詢就出問題。經過研究解決問題。 jeesite.properties配置多數數據源地址,這里以mysql5.7和sqlserver2008…

k8s HPA(HorizontalPodAutoscaler)-自動水平伸縮

Horizontal Pod Autoscaling in Kubernetes寫在前面我們平時部署web服務,當服務壓力大撐不住的時候,我們會加機器(加錢);一般沒有上容器編排是手動加的,臨時加的機器,臨時部署的服務還要改Nginx的配置,最后…

jQuery 基金會和 Dojo 基金會合并:Open Web

統一基金會,服務開發人員,推動開放 Web 技術發展jQuery 基金會和 Dojo 基金會今天宣布計劃聯合,旨在建立最大,最多樣化和最全面的基金會,通過服務開發者,他們的項目,他們的社區來構建開放的 Web…

spark java 邏輯回歸_邏輯回歸分類技術分享,使用Java和Spark區分垃圾郵件

原標題:邏輯回歸分類技術分享,使用Java和Spark區分垃圾郵件由于最近的工作原因,小鳥很久沒給大家分享技術了。今天小鳥就給大家介紹一種比較火的機器學習算法,邏輯回歸分類算法。回歸是一種監督式學習的方式,與分類類似…

jQuery.extend()方法

定義和用法jQuery.extend()函數用于將一個或多個對象的內容合并到目標對象。 注意: 1. 如果只為$.extend()指定了一個參數,則意味著參數target被省略。此時,target就是jQuery對象本身。通過這種方式,我們可以為全局對象jQuery添加…

1066. 圖像過濾(15)

原題: https://www.patest.cn/contests/pat-b-practise/1066 思路: 開胃小菜 實現: #include <stdio.h>int main (void) {int m;int n;int a;int b;int c;char ch;int tmp;int i;int j;scanf("%d %d %d %d %d", &m, &n, &a, &b, &c);// 題…