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

歡迎訪問 生活随笔!

生活随笔

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

java

Java基础 线程同步

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

線程的同步:在編程過程中,為了防止多線程訪問共享資源時發生沖突,Java提供了線程同步機制。所謂同步,就是指一個線程等待另一個線程操作完再繼續的情況。

線程安全:一個類很好地同步以保護它的數據,這個類就稱為線程安全的。

線程不安全:多個線程先后更改數據造成某些線程得到的是無效數據。

概念比較抽象,通過下面的程序來解釋:

this.ticket–表達式的結果為ticket的當前值,因此每次輸出的ticket是當前的票數。但是由輸出結果可以看到最后輸出的:“售票員B賣票.ticket = 0”。這就和之前的if(this.ticket > 0) 產生了沖突,為什么ticket=0,仍然能進入if循環呢?

這就是由于不同步所造成的,程序在運行過程中需要完成兩步操作:

1.判斷是否還有票

2.賣票

但是步驟1和2之間出現了延遲。假設現在只剩下最后一張票,所有線程幾乎同時進入run()方法執行,此時if判斷條件都滿足,再執行自減操作就會有錯誤。這就是線程不同步。

package com.thred;class MyThread implements Runnable {//線程主體類private int ticket = 6;@Overridepublic void run() {//理解為線程的主方法for(int x = 0; x < 50; x++) {if(this.ticket > 0) {//賣票的條件try {Thread.sleep(1000);}catch(InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "賣票.ticket = " + this.ticket--);//this.ticket--表達式的結果為ticket的當前值}}} } public class Test {public static void main(String[] args) {MyThread mt = new MyThread();new Thread(mt, "售票員A").start();new Thread(mt, "售票員B").start();new Thread(mt, "售票員C").start();} } /* 售票員A賣票.ticket = 6 售票員C賣票.ticket = 6 售票員B賣票.ticket = 5 售票員A賣票.ticket = 4 售票員C賣票.ticket = 3 售票員B賣票.ticket = 2 售票員A賣票.ticket = 1 售票員C賣票.ticket = 1 售票員B賣票.ticket = 0 */

怎么解決線程不同步問題?同步代碼塊,同步方法塊。解決了不同步問題,但是程序執行速度變慢,安全性高,性能降低了。

目前只是入門,只簡單的寫一下怎么用,原理的東西等后面深入學習再補充。

同步代碼塊:使用Synchronized關鍵字定義的代碼塊,同步時需要設置一個對象鎖,一般是給當前對象this上鎖。

package com.thred;class MyThread implements Runnable {//線程主體類private int ticket = 6;@Overridepublic void run() {//理解為線程的主方法for(int x = 0; x < 50; x++) {synchronized(this) {//同步代碼塊if(this.ticket > 0) {//賣票的條件try {Thread.sleep(1000);}catch(InterruptedException e) {e.printStackTrace();} System.out.println(Thread.currentThread().getName() + "賣票.ticket = " + this.ticket--);}}}} } public class Test {public static void main(String[] args) {MyThread mt = new MyThread();new Thread(mt, "售票員A").start();new Thread(mt, "售票員B").start();new Thread(mt, "售票員C").start();} } /* 售票員A賣票.ticket = 6 售票員A賣票.ticket = 5 售票員A賣票.ticket = 4 售票員A賣票.ticket = 3 售票員A賣票.ticket = 2 售票員A賣票.ticket = 1 */

同步方法:在一個方法上使用synchronized定義,此方法稱為同步方法。

package com.thred;class MyThread implements Runnable {//線程主體類private int ticket = 6;@Overridepublic void run() {//理解為線程的主方法for(int x = 0; x < 50; x++) {this.sale();}}public synchronized void sale() {//同步方法if(this.ticket > 0) {//賣票的條件try {Thread.sleep(1000);}catch(InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "賣票.ticket = " + this.ticket--);}} } public class Test {public static void main(String[] args) {MyThread mt = new MyThread();new Thread(mt, "售票員B").start();new Thread(mt, "售票員A").start();new Thread(mt, "售票員C").start();} } /* 售票員B賣票.ticket = 6 售票員B賣票.ticket = 5 售票員B賣票.ticket = 4 售票員B賣票.ticket = 3 售票員B賣票.ticket = 2 售票員B賣票.ticket = 1 */

總結

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

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