第三次学JAVA再学不好就吃翔(part116)--同步代码块
生活随笔
收集整理的這篇文章主要介紹了
第三次学JAVA再学不好就吃翔(part116)--同步代码块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
學習筆記,僅供參考,有錯必糾
文章目錄
- 多線程
- 設置線程的優先級
- 同步代碼塊
- 什么情況下需要同步
- 同步代碼塊
- 死鎖
多線程
設置線程的優先級
設置線程優先級:
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); //設置最小的線程優先級t2.setPriority(5);t3.setPriority(Thread.MAX_PRIORITY); //設置最大的線程優先級t1.start();t2.start();t3.start();}}控制臺輸出:
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可以看到優先級高的線程2優先輸出,緊接著是線程1和線程0.
同步代碼塊
什么情況下需要同步
當多線程并發,有多段代碼同時執行時,我們希望某一段代碼執行的過程中CPU不要切換到其他線程,這時就需要同步;
如果兩段代碼是同步的, 那么同一時間只能執行一段, 在一段代碼沒執行結束之前, 不會執行另外一段代碼.
同步代碼塊
使用synchronized關鍵字加上一個鎖對象來定義一段代碼,這就叫同步代碼塊;多個同步代碼塊如果使用相同的鎖對象, 那么他們就是同步的。
- 舉個例子
設置同步代碼塊:
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) { //同步代碼塊,鎖機制,鎖對象可以是任意的System.out.print("安徽");System.out.print("財經");System.out.print("大學");System.out.print("\r\n");}}public void print2() {synchronized(d) { System.out.print("統計");System.out.print("與");System.out.print("應用數學");System.out.print("學院");System.out.print("\r\n");}} }class Demo2 {}在靜態方法上設置synchronized關鍵字,并且將字節碼對象作為鎖:
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("財經");System.out.print("大學");System.out.print("\r\n");}public static void print2() {synchronized(Printer.class) { System.out.print("統計");System.out.print("與");System.out.print("應用數學");System.out.print("學院");System.out.print("\r\n");}} }死鎖
多線程同步的時候,如果出現同步代碼嵌套,使用相同鎖,則可能出現死鎖,比如:
package com.guiyang.restudy3;public class D5GetThreadObject {private static String s1 = "安財";private static String s2 = "數理統計";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();} }控制臺輸出:
可以看到,程序被鎖死,控制臺輸出在Thread-1...獲取數理統計等待安財就停止了。
總結
以上是生活随笔為你收集整理的第三次学JAVA再学不好就吃翔(part116)--同步代码块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈js原型和原型链接_js原型链阮一峰
- 下一篇: 第三次学JAVA再学不好就吃翔(part