日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java的知识点31——线程同步

發布時間:2025/4/16 java 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java的知识点31——线程同步 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線程同步——并發控制

并發:同一個對象多個線程同時操作

線程不安全: 數據有負數、相同

開辟多線程,每個線程都有自己的工作空間? 與 主存 進行交互

/*** 線程不安全: 數據有負數、相同* @author Administrator**/ public class UnsafeTest01 {public static void main(String[] args) {//一份資源UnsafeWeb12306 web=new UnsafeWeb12306();System.out.println(Thread.currentThread().getName());//多個代理new Thread(web,"馬畜").start();new Thread(web,"碼農").start();new Thread(web,"碼蝗").start();} } class UnsafeWeb12306 implements Runnable{//票數private int ticketNums=10;private boolean flag=true;@Overridepublic void run() {while(flag) {test();}}private void test() {if(ticketNums<0) {flag=false;return;}//模擬延時try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);} }


線程不安全:取錢

/*** 線程不安全:取錢* @author Administrator**/ public class UnsafeTest02 {public static void main(String[] args) {//賬戶Account account=new Account(100, "結婚禮金");Drawing you=new Drawing(account, 80, "可悲的你");Drawing wife=new Drawing(account, 90, "happy的她");you.start();wife.start();} }//賬戶 class Account{int money; //金額String name; //名稱public Account(int money, String name) {this.money = money;this.name = name;} } //模擬取款 class Drawing extends Thread{Account account; //取錢的賬戶int drawingMoney; //取的錢數int packetTotal; //口袋的總數public Drawing(Account account, int drawingMoney,String name) {super(name);this.account = account;this.drawingMoney = drawingMoney;}@Overridepublic void run() {if(account.money-drawingMoney<0) {return;}try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}account.money -= drawingMoney;packetTotal+=drawingMoney;System.out.println(this.getName()+"-->賬戶余額為:"+account.money);System.out.println(this.getName()+"-->口袋的錢為:"+packetTotal);}}

線程不安全:操作容器

import java.util.ArrayList; import java.util.List;/*** 線程不安全:操作容器* @author Administrator**/ public class UnsafeTest03 {public static void main(String[] args) {List<String> list=new ArrayList<String>();for(int i=0;i<1000;i++) {new Thread(()->{list.add(Thread.currentThread().getName());}).start();}System.out.println(list.size());} }


什么是線程同步

? 同步問題的提出

? ? ? 現實生活中,我們會遇到“同一個資源,多個人都想使用”的問題。 比如:教室里,只有一臺電腦,多個人都想使用。天然的解決辦法就是,在電腦旁邊,大家排隊。前一人使用完后,后一人再使用。

線程同步的概念

? ? ??處理多線程問題時,多個線程訪問同一個對象,并且某些線程還想修改這個對象。 這時候,我們就需要用到“線程同步”。 線程同步其實就是一種等待機制,多個需要同時訪問此對象的線程進入這個對象的等待池形成隊列,等待前面的線程使用完畢后,下一個線程再使用。

由于同一進程多個線程共享同一塊存儲空間,在帶來方便的同時,也帶來了訪問沖突的問題。為了保證數據在方法中被訪問時的正確性,在訪問時加入鎖機制(synchronized),當一個線程獲得對象的排他鎖,獨占資源,其他線程必須等待,使用后釋放鎖即可。

存在以下問題:1. 一個線程持有鎖會導致其他需要此鎖的線程掛起

? ? ? ? ? ? ? ? ? ? ? ? ?2. 在多線程競爭下,加鎖、釋放鎖會導致比較多的上下文切換和調度延時,引起性能問題

? ? ? ? ? ? ? ? ? ? ? ? ?3. 如果一個優先級高的線程等待一個優先級低的線程釋放會導致優先級倒置,引起性能問題。

由于可以通過 private 關鍵字來保證數據對象只能被方法訪問,所以我們只需針對方法提出一套機制,這套機制就是synchronized關鍵字,它包括兩種用法:synchronized 方法synchronized 塊

? synchronized 方法

? ? ??通過在方法聲明中加入 synchronized關鍵字來聲明,語法如下:

? ? ? ??

?synchronized 方法控制對“對象的類成員變量”的訪問:每個對象對應一把鎖,每個 synchronized 方法都必須獲得調用該方法的對象的鎖方能執行,否則所屬線程阻塞,方法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,此后被阻塞的線程方能獲得該鎖,重新進入可執行狀態。

??synchronized 方法的缺陷:若將一個大的方法聲明為synchronized 將會大大影響效率。

線程安全: 在并發時保證數據的正確性、效率盡可能高
?* synchronized
?* 1、同步方法
?* 2、同步塊

/*** * 線程安全: 在并發時保證數據的正確性、效率盡可能高* synchronized* 1、同步方法* 2、同步塊* @author Administrator**/ public class SynTest01 {public static void main(String[] args) {//一份資源SafeWeb12306 web =new SafeWeb12306();//多個代理new Thread(web,"碼畜").start();new Thread(web,"碼農").start();new Thread(web,"碼蟥").start();;}}class SafeWeb12306 implements Runnable{//票數private int ticketNums =10;private boolean flag = true;@Overridepublic void run() {while(flag) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}test();}} //線程安全 同步public synchronized void test() {if(ticketNums<=0) {flag = false;return ;}//模擬延時try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);} }


//目標不對鎖定失敗

同步塊:synchronized(obj){}? obj? 稱為 同步監視器

塊:局部塊 構造塊 靜態塊? 普通塊

同步方法中無需指定同步監視器,因為同步方法的同步監視器this即對象本身,或class即類的模子

/*** 線程安全: 在并發時保證數據的正確性、效率盡可能高* synchronized* 1、同步方法* 2、同步塊 ,目標更明確* @author Administrator**/ class Account{int money;String name;public Account(int money, String name) {this.money = money;this.name = name;} }public class SynBlockTest01 {public static void main(String[] args) { //賬戶Account account =new Account(100,"結婚禮金");SynDrawing you = new SynDrawing(account,80,"可悲的你");SynDrawing wife = new SynDrawing(account,90,"happy的她");you.start();wife.start();} } //模擬取款 線程安全 class SynDrawing extends Thread{Account account ; //取錢的賬戶int drawingMoney ;//取的錢數int packetTotal ; //口袋的總數 public SynDrawing(Account account, int drawingMoney,String name) {super(name);this.account = account;this.drawingMoney = drawingMoney;}@Overridepublic void run() {test() ;}//目標鎖定accountpublic void test() {//提高性能if(account.money<=0) {return ;}//同步塊synchronized(account) {if(account.money -drawingMoney<0) {return; }try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}account.money -=drawingMoney;packetTotal +=drawingMoney;System.out.println(this.getName()+"-->賬戶余額為:"+account.money);System.out.println(this.getName()+"-->口袋的錢為:"+packetTotal);}} }



線程安全:操作容器

import java.util.ArrayList; import java.util.List;/*** 線程安全:操作容器* @author Administrator**/ public class SynBlockTest02 {public static void main(String[] args) throws InterruptedException {List<String> list=new ArrayList<String> ();for(int i=0;i<10000;i++) {new Thread(()-> {//同步塊synchronized (list) {list.add(Thread.currentThread().getName());}}).start();}Thread.sleep(1000);System.out.println(list.size());} }

?

總結

以上是生活随笔為你收集整理的Java的知识点31——线程同步的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费三级黄 | 日本高清视频免费观看 | bangbros性欧美18 | 永久av网站 | 欧美日韩小视频 | 免费视频一二三区 | 国产最新在线 | 欧美一区二区三区日韩 | 午夜久久久久久久久久影院 | 少妇日皮视频 | 人妻久久久一区二区三区 | 天天综合网天天综合色 | 2019天天干天天操 | 久久久免费毛片 | 6080久久| 五月天激情小说 | 欧美成人二区 | 国产精品伦一区二区三区 | 日韩免费影视 | 诱惑の诱惑筱田优在线播放 | 日韩欧美亚洲成人 | 男女一进一出视频 | 99久久精品久久久久久清纯 | 日韩av色| 伊人av综合 | 欧美xxx在线观看 | 国产黄色片免费观看 | 成人狠狠干 | 天堂网2018 | 黄色大片免费在线观看 | 欧美在线观看视频一区 | 亚洲国产成人一区 | 让男按摩师摸好爽视频 | 少女情窦初开的第4集在线观看 | 亚洲怡红院av | 精品久| 国产精品aⅴ| 精品国产亚洲av麻豆 | 不卡影院 | 小视频在线观看 | 天天搞夜夜爽 | www.色综合.com | 超碰人人做 | 女人天堂av| 丰满少妇一区二区三区 | 国产11页| 无码少妇一区二区三区 | 性歌舞团一区二区三区视频 | 国产欧美网站 | 国精品无码一区二区三区 | 2019国产在线 | 国产精品一区二 | 精品久久久亚洲 | 91爱国产| 性视频在线 | 五月婷激情 | 五月天啪啪 | 亚洲天堂小说 | 日少妇的逼 | 蜜臀aⅴ国产精品久久久国产老师 | 午夜在线一区 | 91成人在线观看喷潮蘑菇 | 成人日批视频 | 日本一区二区三区网站 | 一区在线免费观看 | 小辣椒福利视频导航 | 国产乱真实合集 | 久久久www免费人成人片 | 粉色视频免费观看 | 中文字幕一区二区三区人妻四季 | caoporm超碰| 999资源站 | 精品九九 | 国产精品毛片一区二区在线看舒淇 | 九九色网 | www.毛片.com| 四虎啪啪 | 国内精品在线播放 | 色偷偷资源| 黄网站免费在线 | 成年人三级视频 | 日本午夜精华 | 亚洲国产无线乱码在线观看 | 美脚の诱脚舐め脚视频播放 | 天天操天天射天天爱 | 色眯眯视频 | 精品中文在线 | 国产精品爱啪在线线免费观看 | 使劲插视频 | 99插插插 | 成人av手机在线观看 | 亚洲一区二区三区高清在线 | 抖音视频在线观看 | 免费观看久久 | 超碰在线观看99 | 日本不卡在线视频 | 新x8x8拨牐拨牐永久免费影库 | 麻豆精品久久 | bt天堂av |