自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java編程語言需要注意線程安全和同步

開發(fā) 后端
Java編程語言在目前看來是一門相當簡單的編程語言,但是在實際的使用中我們需要注意在線程安全和同步上下功夫。

Java編程語言對于使用者來說是一個相當簡單的編程語言。但是在使用的時候還是需要我們不斷注意相關(guān)問題,下面我們就來熟悉下Java編程語言的線程安全問題和信息同步。

就其自身來說,并發(fā)編程是一種技術(shù),提供了操作的同時執(zhí)行,不論是在單一系統(tǒng)上還是分布在大量系統(tǒng)上。這類操作實際是一些指令順序,例如單獨某個***任務(wù)的子任務(wù),這類操作能夠并行執(zhí)行,或者是作為線程,或者是作為進程。線程和進程之間的本質(zhì)區(qū)別在于:進程通常是獨立的(例如獨立的地址空間),所以只能通過系統(tǒng)提供的進程間通信機制進行交互,而線程通常共享單一進程的狀態(tài)信息,能夠直接共享系統(tǒng)資源和內(nèi)存中的對象。

可以使用下面兩種方法之一,通過多個進程來實現(xiàn)并發(fā)。***種方法是在同一個處理器上運行進程,由操作系統(tǒng)處理進程之間的上下文環(huán)境切換。(可以理解,這種切換要比同一進程內(nèi)多線程之間的上下文環(huán)境切換更慢。)第二種方法是構(gòu)建大規(guī)模的并行和復(fù)雜的分布式系統(tǒng),在不同的物理處理器上運行多個進程。

從內(nèi)建支持的角度來說,Java編程語言通過線程提供并發(fā)編程;每個 JVM 都能支持許多線程同時執(zhí)行??梢杂靡韵聝煞N方法之一在Java編程語言中創(chuàng)建線程:

繼承 java.lang.Thread 類。在這種情況下,已經(jīng)重寫的子類的 run() 方法必須包含實現(xiàn)線程運行時行為的代碼。要執(zhí)行這個代碼,需要實例化子類對象,然后調(diào)用對象的 start() 方法,這樣就可以在內(nèi)部執(zhí)行 run() 方法了。#t#

創(chuàng)建 Runnable 接口的定制實現(xiàn)。這個接口只包含一個 run() 方法,在這個方法中,要放置應(yīng)用程序代碼。要執(zhí)行這個代碼,需要實例化實現(xiàn)類的對象,然后在創(chuàng)建新 Thread 時,把對象作為構(gòu)造函數(shù)的參數(shù)傳入。然后調(diào)用新創(chuàng)建的線程對象的 start() 方法,開始執(zhí)行控制的新線程。

線程安全性和同步

如果Java編程語言對象中的某個方法能夠安全地運行在多線程環(huán)境中,那么就稱該方法是 線程安全的。要獲得這種安全性,必須有一種機制,通過該機制,運行同一方法的多個線程就能夠同步其操作,這樣,在訪問相同的對象或代碼行時,就會只允許一個線程被處理。這種同步要求線程使用叫作 信號 的對象彼此進行溝通。

有一種類型的信號叫作 互斥信號 或 互斥體。顧名思義,這個信號對象的擁有權(quán)是互斥的,也就是說,在任意指定時間,只有一個線程能夠擁有互斥體。其他想獲得所有權(quán)的線程會被阻塞,它們必須等待,直到擁有互斥體的線程釋放互斥體。如果多個線程按順序排隊等候同一互斥體,那么在當前擁有者釋放它的時候,只有一個等候線程能夠得到它;其他線程將繼續(xù)阻塞。

在 1970 年代初,C.A.R. Hoare 和其他人共同開發(fā)了一個叫作 監(jiān)視器 的概念。一個 監(jiān)視器 就是一個代碼主體,它的訪問受到互斥體的保護。任何想執(zhí)行這個代碼的線程,都必須在代碼塊頂部得到關(guān)聯(lián)的互斥體,然后在底部再釋放它。因為在指定時間只有一個線程能夠擁有互斥體,所以這就有效地保證了只有擁有它的線程才能執(zhí)行監(jiān)視器的代碼塊。(受保護的代碼不需要相鄰 —— 例如,Java編程語言中的每個對象都有一個與之關(guān)聯(lián)的監(jiān)視器。)

任何想在 Java編程語言中進行線程編程的開發(fā)人員,都會立即把上面的內(nèi)容當成 synchronized 關(guān)鍵字所帶來的效果??梢源_保包含在 synchronized 塊中的 Java 代碼在指定時間只被一個線程執(zhí)行。在內(nèi)部,可以由運行時將 synchronized 關(guān)鍵字轉(zhuǎn)換成某一種情況:所有的競爭線程都試圖獲得與它們(指線程)正在操作的對象實例關(guān)聯(lián)的那個(惟一的一個)互斥體。成功得到互斥體的線程將運行代碼,然后在退出 synchronized 塊時釋放互斥體。

等候和通知

wait/notify 構(gòu)造在 Java編程語言的線程間通信機制中也扮演了重要的角色?;镜南敕ㄊ牵阂粋€線程需要的某個條件可以由另外一個線程促成。這樣,條件的 wait 就可以得到滿足。一旦條件為真,那么引發(fā)條件的線程就會 notify 等候線程蘇醒,并從中止的地方繼續(xù)進行。

wait/notify 機制要比 synchronized 機制更難理解和判斷。要想判斷出使用 wait/notify 的方法的行為邏輯,就要求判斷出使用它的所有方法的邏輯。一次判斷一個方法,把該方法和其他方法隔離開,是對整體系統(tǒng)行為得出錯誤結(jié)論的可靠方式。顯然,這樣做的復(fù)雜性會隨著要判斷的方法的數(shù)量增長而迅速提高。

 

責(zé)任編輯:張浩 來源: 博客園
相關(guān)推薦

2020-03-19 15:02:53

Go語言學(xué)習(xí)

2010-09-01 13:37:32

2009-06-30 10:10:15

Namespace用法Flex

2015-09-16 13:19:11

2020-10-26 14:01:22

Java泛型

2023-02-16 07:27:15

2014-12-23 13:50:46

多播組播

2020-09-28 11:14:57

線程數(shù)據(jù)語言

2011-05-26 17:37:11

Ajax

2023-12-21 10:34:04

2016-09-23 16:09:01

2009-07-16 09:25:27

Java常量定義

2017-01-06 15:09:13

編程訣竅

2010-07-20 15:00:06

網(wǎng)上購物信息安全360安全中心

2025-02-19 00:05:18

Java并發(fā)編程

2009-04-23 14:30:19

UML建模

2013-09-29 10:36:08

VMware虛擬化

2023-07-27 18:39:20

低代碼開發(fā)編碼

2014-07-23 14:47:35

數(shù)據(jù)保護災(zāi)難恢復(fù)GRC

2023-09-26 10:30:57

Linux編程
點贊
收藏

51CTO技術(shù)棧公眾號