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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第三次学JAVA再学不好就吃翔(part116)--同步代码块

發(fā)布時(shí)間:2023/12/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三次学JAVA再学不好就吃翔(part116)--同步代码块 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

學(xué)習(xí)筆記,僅供參考,有錯(cuò)必糾


文章目錄

    • 多線程
      • 設(shè)置線程的優(yōu)先級(jí)
      • 同步代碼塊
        • 什么情況下需要同步
        • 同步代碼塊
      • 死鎖



多線程


設(shè)置線程的優(yōu)先級(jí)


設(shè)置線程優(yōu)先級(jí):

package com.guiyang.restudy3;public class D5GetThreadObject {public static void main(String[] args) {Thread t1 = new Thread(){public void run() {for(int i = 0; i < 10; i++) {System.out.println(getName() + "...xxxxxxxxxx" );}}};Thread t2 = new Thread(){public void run() {for(int i = 0; i < 10; i++) {System.out.println(getName() + "...yyyyy" );}}};Thread t3 = new Thread(){public void run() {for(int i = 0; i < 10; i++) {System.out.println(getName() + "...zz" );}}};t1.setPriority(Thread.MIN_PRIORITY); //設(shè)置最小的線程優(yōu)先級(jí)t2.setPriority(5);t3.setPriority(Thread.MAX_PRIORITY); //設(shè)置最大的線程優(yōu)先級(jí)t1.start();t2.start();t3.start();}}

控制臺(tái)輸出:

Thread-2...zz Thread-2...zz Thread-2...zz Thread-2...zz Thread-2...zz Thread-2...zz Thread-0...xxxxxxxxxx Thread-1...yyyyy Thread-1...yyyyy Thread-1...yyyyy Thread-1...yyyyy Thread-1...yyyyy Thread-1...yyyyy Thread-1...yyyyy Thread-0...xxxxxxxxxx Thread-2...zz Thread-2...zz Thread-2...zz Thread-2...zz Thread-0...xxxxxxxxxx Thread-1...yyyyy Thread-0...xxxxxxxxxx Thread-0...xxxxxxxxxx Thread-1...yyyyy Thread-1...yyyyy Thread-0...xxxxxxxxxx Thread-0...xxxxxxxxxx Thread-0...xxxxxxxxxx Thread-0...xxxxxxxxxx Thread-0...xxxxxxxxxx

可以看到優(yōu)先級(jí)高的線程2優(yōu)先輸出,緊接著是線程1和線程0.


同步代碼塊


什么情況下需要同步


當(dāng)多線程并發(fā),有多段代碼同時(shí)執(zhí)行時(shí),我們希望某一段代碼執(zhí)行的過程中CPU不要切換到其他線程,這時(shí)就需要同步;

如果兩段代碼是同步的, 那么同一時(shí)間只能執(zhí)行一段, 在一段代碼沒執(zhí)行結(jié)束之前, 不會(huì)執(zhí)行另外一段代碼.


同步代碼塊


使用synchronized關(guān)鍵字加上一個(gè)鎖對(duì)象來定義一段代碼,這就叫同步代碼塊;多個(gè)同步代碼塊如果使用相同的鎖對(duì)象, 那么他們就是同步的。


  • 舉個(gè)例子

設(shè)置同步代碼塊:

package com.guiyang.restudy3;public class D5GetThreadObject {public static void main(String[] args) {final Printer p = new Printer();new Thread() {public void run() {while(true) {p.print1();}}}.start();new Thread() {public void run() {while(true) {p.print2();}}}.start();} }class Printer {Demo2 d = new Demo2();public void print1() {synchronized(d) { //同步代碼塊,鎖機(jī)制,鎖對(duì)象可以是任意的System.out.print("安徽");System.out.print("財(cái)經(jīng)");System.out.print("大學(xué)");System.out.print("\r\n");}}public void print2() {synchronized(d) { System.out.print("統(tǒng)計(jì)");System.out.print("與");System.out.print("應(yīng)用數(shù)學(xué)");System.out.print("學(xué)院");System.out.print("\r\n");}} }class Demo2 {}

在靜態(tài)方法上設(shè)置synchronized關(guān)鍵字,并且將字節(jié)碼對(duì)象作為鎖:

package com.guiyang.restudy3;public class D5GetThreadObject {public static void main(String[] args) {new Thread() {public void run() {while(true) {Printer.print1();}}}.start();new Thread() {public void run() {while(true) {Printer.print2();}}}.start();} }class Printer {public static synchronized void print1() {System.out.print("安徽");System.out.print("財(cái)經(jīng)");System.out.print("大學(xué)");System.out.print("\r\n");}public static void print2() {synchronized(Printer.class) { System.out.print("統(tǒng)計(jì)");System.out.print("與");System.out.print("應(yīng)用數(shù)學(xué)");System.out.print("學(xué)院");System.out.print("\r\n");}} }

死鎖


多線程同步的時(shí)候,如果出現(xiàn)同步代碼嵌套,使用相同鎖,則可能出現(xiàn)死鎖,比如:

package com.guiyang.restudy3;public class D5GetThreadObject {private static String s1 = "安財(cái)";private static String s2 = "數(shù)理統(tǒng)計(jì)";public static void main(String[] args) {new Thread() {public void run() {while(true) {synchronized(s1) {System.out.println(getName() + "...獲取" + s1 + "等待" + s2);synchronized(s2) {System.out.println(getName() + "...拿到" + s2);}}}}}.start();new Thread() {public void run() {while(true) {synchronized(s2) {System.out.println(getName() + "...獲取" + s2 + "等待" + s1);synchronized(s1) {System.out.println(getName() + "...拿到" + s1);}}}}}.start();} }

控制臺(tái)輸出:

可以看到,程序被鎖死,控制臺(tái)輸出在Thread-1...獲取數(shù)理統(tǒng)計(jì)等待安財(cái)就停止了。


總結(jié)

以上是生活随笔為你收集整理的第三次学JAVA再学不好就吃翔(part116)--同步代码块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。