格言:在程序猿界混出點(diǎn)名堂!
《JAVA并發(fā)編程實(shí)戰(zhàn)》解讀
【連載】第1章-1.4線程無(wú)處不在
回顧:在1.3中介紹了,線程帶來(lái)的風(fēng)險(xiǎn)鲜滩,包括安全性問(wèn)題、活躍性問(wèn)題還有性能問(wèn)題节值,這一小節(jié)講的是線程無(wú)處不在徙硅。
每個(gè)JAVA應(yīng)用程序都會(huì)使用線程。
當(dāng)JVM啟動(dòng)后搞疗,為JVM內(nèi)部任務(wù)(比如垃圾回收器)創(chuàng)建后臺(tái)線程嗓蘑,并創(chuàng)建一個(gè)主線程來(lái)運(yùn)行main方法∧淠耍可以使用jstack的監(jiān)控工具打印堆棧日志查看桩皿,我只寫了一個(gè)main方法啟動(dòng),可以看到有很多的JVM線程幢炸。
"main" #1 prio=5 os_prio=31 tid=0x00007f9f3c801800 nid=0x2803 waiting on condition [0x000070000d152000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at cn.kazz.RunOneTask.main(RunOneTask.java:8)
"VM Thread" os_prio=31 tid=0x00007f9f3c83e800 nid=0x5103 runnable
"GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007f9f3c800800 nid=0x2007 runnable
"GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007f9f3c81d000 nid=0x2103 runnable
"GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007f9f3c81d800 nid=0x5403 runnable
"GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007f9f3c81e000 nid=0x2b03 runnable
"VM Periodic Task Thread" os_prio=31 tid=0x00007f9f3b00a000 nid=0x3a03 waiting on condition
多數(shù)Java應(yīng)用程序都是多線程
多少Java應(yīng)用程序都是多線程泄隔,使用時(shí)需要對(duì)應(yīng)用程序的狀態(tài)(比如內(nèi)存變量)的訪問(wèn)進(jìn)行
協(xié)同
。
而且一些框架引入了并發(fā)性時(shí)宛徊,通常并發(fā)性不僅局限于框架代碼佛嬉。比如下面提到的這些。
Timer
Java的工具闸天,作用是在稍后的片刻運(yùn)行暖呕,或者運(yùn)行一次或者周期性運(yùn)行。
帶來(lái)的問(wèn)題是周期性運(yùn)行可能改變其他線程訪問(wèn)的共享數(shù)據(jù)
苞氮。也就是說(shuō)Timer本身就是一個(gè)線程湾揽,可能存在不安全的操作,最簡(jiǎn)單的方式解決這種不安全就是把線程安全封裝在共享對(duì)象內(nèi)部葱淳。AtomicInteger
就是很好的安全封裝的例子钝腺。Servlet和JSP
Servlet框架屬于Web應(yīng)用程序。有可能同一個(gè)Servlet服務(wù)同時(shí)被多個(gè)客戶端調(diào)用赞厕,也就是多線程調(diào)用艳狐,因此也需要注意線程安全的問(wèn)題。遠(yuǎn)程方法調(diào)用
就是RMI皿桑,跟Dubbo毫目、Thrift等框架類似蔬啡,這些框架跟Servlet一樣,也可以被多個(gè)客戶端調(diào)用镀虐,存在訪問(wèn)共享變量的安全性問(wèn)題箱蟆,對(duì)共享變量也要協(xié)同共享對(duì)象的狀態(tài)。
知識(shí)點(diǎn)
- 了解這些多線程的框架來(lái)體會(huì)多線程可能帶來(lái)的非安全性問(wèn)題刮便。
喜歡連載可關(guān)注
簡(jiǎn)書
或者微信公眾號(hào)
:
簡(jiǎn)書專題:Java并發(fā)編程實(shí)戰(zhàn)-可愛豬豬解讀
http://www.reibang.com/c/ac717321a386
微信公眾號(hào):逗哥聊IT
空猜。