电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺析Java 并發編程中的synchronized

瀏覽:8日期:2022-08-20 09:14:41

synchronized關鍵字,我們一般稱之為“同步鎖”,用它來修飾需要同步的方法和需要同步代碼塊,默認是當前對象作為鎖的對象。在用synchronized修飾類時(或者修飾靜態方法),默認是當前類的Class對象作為鎖的對象,故存在著方法鎖、對象鎖、類鎖這樣的概念。

一、沒有設置線程同步的情況

先給出以下代碼感受下代碼執行的時候為什么需要同步?代碼可能比較枯燥,配上業務理解起來就會舒服很多,學生軍訓,有三列,每列5人,需要報數,每個線程負責每一列報數。

class SynchronizedExample {protected static int num = 0;protected void numberOff() {for(int i=0; i<5; i++) {num++;System.out.println(Thread.currentThread().getName()+':'+SynchronizedExample.num);}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {SynchronizedExample se = new SynchronizedExample();for(int i=1; i<=3; i++) {new Thread( ()-> {se.numberOff();}, '線程'+i).start();}}}

執行結果如下:

線程1:1線程2:2線程1:3線程3:4.......

之所以出現這種情況,是因為三個線程是異步的,沒有同步。對應的業務場景就是,在第一列沒有完成報數的時候,其他隊列搶報了,這在現實中是不允許的,所以需要類似于synchronized等具有同步功能的關鍵字粉末登場。

二、方法同步鎖

當報數方法加上synchronized關鍵字之后,就會一列一列的報數。

protected synchronized void numberOff() {for(int i=0; i<5; i++) {num++;System.out.println(Thread.currentThread().getName()+':'+SynchronizedExample.num);}}

執行結果如下:

線程1:1線程1:2線程1:3線程1:4......

寫到這里還是要從技術層面講下原理,當一個線程執行帶有synchronized關鍵字的方法時,該線程會在該方法處設置一個鎖(其他線程打不開這個鎖,只能在外邊等該線程釋放掉該鎖,一般都是執行完所有代碼后主動釋放鎖),表示此方法是當前線程獨占的,對應到上述業務中就是一次只能有一個隊列報數。

三、對象鎖

改進后的代碼用到了一個對象鎖,該對象鎖默認是當前對象,上述代碼等同于以下代碼:

protected void numberOff() {synchronized (this) {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}

當多個線程用一個對象鎖,各個線程可以達到同步的作用,如果每個線程都用自己的對象鎖,那么synchronized就失去了同步的作用。如以下代碼:

class SynchronizedExample {protected static int num = 0;protected void numberOff() {synchronized (this) {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {SynchronizedExample se = new SynchronizedExample();for(int i=1; i<=3; i++) {new Thread( ()-> {new SynchronizedExample().numberOff();}, '隊列'+i).start();}}}

執行結果如下:

線程1:1線程2:2線程1:3線程3:4.......

有讀者會說不同線程執行的是不同對象中的方法,肯定達不到同步的效果,也對,也很有道理,接著看如下代碼:

class SynchronizedExample {protected static int num = 0;protected void numberOff(Object lock) {synchronized (lock) {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {SynchronizedExample se = new SynchronizedExample();for(int i=1; i<=3; i++) {new Thread( ()-> {se.numberOff(new Object());}, '隊列'+i).start();}}}

執行結果如下:

線程1:1線程2:2線程1:3線程3:4.......

四、類鎖

對于上述問題,讀者應該得出一個結論,要想達到同步的效果,必須用同一個鎖,此時類鎖可以粉末登場。看如下代碼:

protected void numberOff(Object lock) {synchronized (SynchronizedExample.class) {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}

上述代碼可以達到同步的效果。

五、靜態鎖

靜態鎖是針對靜態方法而言,當一個靜態方法中有synchronized關鍵字時,默認的是使用當前類字節碼對象作為鎖。代碼示例如下:

class SynchronizedExample {protected static int num = 0;protected synchronized static void numberOff() {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {for (int i = 1; i <= 3; i++) {new Thread(() -> { new SynchronizedExample().numberOff(); }, '隊列' + i).start();}}}

六、線程池實現

最后用線程池將上述代碼寫一下

package ioo;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;class SynchronizedExample {protected static int num = 0;protected synchronized static void numberOff() {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {ExecutorService executorService = Executors.newCachedThreadPool();for(int i=1; i<=3; i++) {executorService.execute(() -> new SynchronizedExample().numberOff());}}}

以上就是淺析Java 并發編程中的synchronized的詳細內容,更多關于Java 并發編程 synchronized的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 泰安办公家具-泰安派格办公用品有限公司| 防火板_饰面耐火板价格、厂家_品牌认准格林雅 | 空气弹簧|橡胶气囊|橡胶空气弹簧-上海松夏减震器有限公司 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 淄博不锈钢无缝管,淄博不锈钢管-鑫门物资有限公司 | 衬四氟_衬氟储罐_四氟储罐-无锡市氟瑞特防腐科技有限公司 | 连续油炸机,全自动油炸机,花生米油炸机-烟台茂源食品机械制造有限公司 | 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 双段式高压鼓风机-雕刻机用真空泵-绍兴天晨机械有限公司 | 泰兴市热钻机械有限公司-热熔钻孔机-数控热熔钻-热熔钻孔攻牙一体机 | 泰安塞纳春天装饰公司【网站】| 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | Boden齿轮油泵-ketai齿轮泵-yuken油研-无锡新立液压有限公司 | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | 污水处理设备-海普欧环保集团有限公司 | 安徽华耐泵阀有限公司-官方网站| 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 奥运星-汽车性能网评-提供个性化汽车资讯 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 粘度计NDJ-5S,粘度计NDJ-8S,越平水分测定仪-上海右一仪器有限公司 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 开云(中国)Kaiyun·官方网站-登录入口 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 |