java sync_Java同步简介 - 加大装益达 - OSCHINA - 中文开源技术交流社区
原文鏈接
[TOC]
Java同步
Java中同步一直都是很重要的問題,對于初學者來說也是不太容易能理解的問題。特在此記錄一下有關Java中同步和鎖的知識。主要涉及到同步的概念以及Java中解決的辦法和簡單的例子。有關鎖Lock中的內容不在此做說明。
同步
為什么需要同步
這個問題不難回答。當牽扯到同步問題的時候,就離不開多線程了。簡單舉個例子,桌子上有一臺2016新款MacBook pro,我和女朋友都想要去玩,我們倆同時伸向了那臺電腦,后果可想而知(當然是我地上坐著玩手機去了!),我們倆都在搶那臺電腦,誰也玩不了。這時候該怎么辦?我們會約定好,一人半個小時,我在玩電腦的時候你拿著手機玩……就這樣一人一段時間的玩。分析一下,電腦就是被競爭的資源,我和女朋友是兩個線程,關于怎么玩電腦就需要同步來解決了,要不然不就打起來了么。
同步就是要多個運行的線程在一起良好的工作,在訪問同一個資源時不會造成資源的錯誤或者混亂。
Java中同步的解決辦法
Java中內置了synchronized關鍵字來控制線程的同步。synchronized關鍵字可以修飾方法或者代碼塊,當有一個線程進入到了synchronized方法或者代碼塊中的時候,其他的線程就不能進入到此方法或者代碼塊中,必須等待剛才的線程完成退出synchronized方法或者代碼塊之后,等待的方法才能去執行。就是我女票玩電腦的時候,我就不能玩,必須等著。
鎖
synchronized其實就是實現鎖的功能。Java中每個對象都有一個內置鎖,每次需要訪問同步方法或者同步塊的時候,必須獲得相應的鎖。要不然等待的線程怎么能知道這塊代碼是不是被其他線程在用呢。
同步的幾種情況
synchronized修飾一個方法
修飾一個方法時,能夠保證同一時刻最多只有一個線程執行該方法中的代碼。此時鎖的是當前實例對象,如果該對象還有其他的synchronized方法,也不能被其他線程訪問,因為當前對象的鎖只有一個。但是對于該對象其他的非synchronized方法其他線程則可以訪問。
synchronized修飾代碼塊
此時代碼塊應該用synchronized(this)來修飾,鎖的也是當前實例對象,該對象其他的同步方法和同步塊也不能被其他線程訪問。
synchronized修飾靜態方法
靜態方法是屬于類的而不屬于對象的,所以靜態方法的鎖是類對象。一個synchronized靜態方法被訪問時,其他線程不能訪問這個類的所有對象的同步方法。這個鎖是類級別的。
synchronized(.class)修飾的代碼塊
線程進入synchronized(.class)修飾的代碼塊,會將整個類的所有這個synchronized(.class) 同步代碼塊鎖定,其他線程沒有辦法訪問synchronized(.class)修飾的代碼塊。屬于class級別的。但是其他線程可以訪問非靜態的同步方法或者代碼塊。
總結
以上是生活随笔為你收集整理的java sync_Java同步简介 - 加大装益达 - OSCHINA - 中文开源技术交流社区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java面试 socket_【面试题】J
- 下一篇: 图书查找java_java第三季第一章: