日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

runoob.com,多線程編程

如何理解應用Java多線程與并發(fā)編程?

runoob.com,多線程編程


你好,很高興回答你的問題!下面是Java多線程與并發(fā)編程詳解整合,希望對你有所幫助!一、多線程三大特性多線程有三大特性:原子性、可見性、有序性 。原子性(跟數據庫的事務特性中的原子性類似,數據庫的原子性體現是dml語句執(zhí)行后需要進行提交):理解:即一個操作或多個操作,要么全部執(zhí)行并且執(zhí)行的過程中不會被任何因素打斷,要么都不執(zhí)行 。
一個很經典的例子就是銀行賬戶轉賬問題:比如從賬戶A向賬戶B轉5000元,那么必然包括2個操作:從賬戶A減去5000元,往賬戶B加上5000元 。這2個操作必須要具備原子性才能保證不出現一些意外的問題 。我們操作數據也是如此,比如i = i 1;其中就包括,讀取i的值,計算i,寫入i 。這行代碼在Java中是不具備原子性的,則多線程運行肯定會出問題,所以也需要我們使用同步synchronized和lock鎖這些東西來確保這個特性了 。
原子性其實就是保證數據一致、線程安全一部分,可見性:可見性是與java內存模型息息相關的 。當多個線程訪問同一個變量時,一個線程修改了這個變量的值,其他線程能夠立即看得到修改的值 。若兩個線程在不同的cpu,那么線程1改變了i的值還沒刷新到主存,線程2又使用了i,那么這個i值肯定還是之前的,線程1對變量的修改線程2沒有看到,這就是可見性問題 。
有序性:理解:程序執(zhí)行的順序按照代碼的先后順序執(zhí)行 。一般來說,處理器為了提高程序運行效率,可能會對輸入代碼進行優(yōu)化,它不保證程序中各個語句的執(zhí)行先后順序同代碼中的順序一致,但是它會保證程序最終執(zhí)行結果和代碼順序執(zhí)行的結果是一致的 。二、Java內存模型jvm的內存結構為:堆、棧、方法區(qū),不同于java的內存模型,Java的內存模型是關于多線程相關的 。
理解:共享內存模型指的是Java內存模型(簡稱JMM),JMM決定一個線程對共享變量的寫入時,能對另一個線程可見 。從抽象的角度來看,JMM定義了線程和主內存之間的抽象關系:線程之間的共享變量存儲在主內存(main memory)中(局部變量不會存儲在),每個線程都有一個私有的本地內存(local memory),本地內存中存儲了該線程以讀/寫共享變量的副本 。
本地內存是JMM的一個抽象概念,并不真實存在 。它涵蓋了緩存、寫緩沖區(qū)、寄存器以及其他的硬件和編輯器優(yōu)化 ??偨Y:什么是Java內存模型:java內存模型簡稱jmm,定義了一個線程對另一個線程可見 。共享變量存放在主內存中,每個線程都有自己的本地內存,當多個線程同時訪問一個數據的時候,可能本地內存沒有及時刷新到主內存,所以就會發(fā)生線程安全問題 。
三、Volatile關鍵字Volatile關鍵字的作用:變量在多個線程之間可見 。Volatile關鍵字是非原子性的,不能保證數據的原子性,只是能夠把解決立馬刷新到主內存中,不能解決并發(fā)問題 。如果想要保證數據的原子性,解決并發(fā)問題,需要使用并發(fā)包里的AutomicInteger原子類 。volatile與synchronized區(qū)別:僅靠volatile不能保證線程的安全性(原子性) 。
1.volatile輕量級,只能修飾變量 。synchronized重量級,還可修飾方法 。2.volatile只能保證數據的可見性,不能用來同步,因為多個線程并發(fā)訪問volatile修飾的變量不會阻塞 。四、TreadLocal1.什么是ThreadLocal?ThreadLocal提高一個線程的局部變量,訪問某個線程擁有自己局部變量 。
當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程對應的副本 。ThreadLocal接口方法有4個:void set(Object value)設置當前線程的線程局部變量的值;public Object get()該方法返回當前線程所對應的線程局部變量;public void remove()將當前線程局部變量的值刪除,目的是為了減少內存的占用,該方法是JDK5.0新增的方法 。

推薦閱讀