內容:
多個線程多個鎖,對象鎖和類鎖
對象鎖的同步和非同步 對象鎖和類鎖
概念
1 多個線程多個鎖
多個線程,每個線程都可以拿到自己指定的鎖,分別獲得鎖之後,執行synchronized方法體的內容。
package com.wuk.thread;public class ThreadTest02 extends Thread{ private int num = 0; public synchronized void printNum(String tag){ try { if(tag.equals("a")){ num=100; System.out.println("tag a , set num over!"); Thread.sleep(1000); }else { num=200; System.out.println("tag b,set num over!"); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("tag"+tag+",num="+num); } public static void main(String[] args) { //定義建立兩個不同對象 final ThreadTest02 tt1=new ThreadTest02(); final ThreadTest02 tt2=new ThreadTest02(); Thread t1=new Thread(new Runnable() { @Override public void run() { tt1.printNum("a"); } }); Thread t2=new Thread(new Runnable() { @Override public void run() { tt2.printNum("b"); } }); t1.start(); t2.start(); }}
輸出結果:
各自線程輸出各自的互不影響,因為他們是不同的對象,各自持有各自對象的鎖,所以各自執行互不干涉。
tag a , set num over!tag b,set num over!tagb,num=200taga,num=100
但是如果給printNum()加上static,這樣無論你建立多少個對象,鎖只有一把,是屬於類層級的鎖,而非對象。也就是說如果將synchronized 加在靜態方法上就表示該鎖是類層級鎖,而非對象鎖。
輸出結果:
一個個執行,線程1執行完了以後釋放鎖,線程2才可以執行。
tag a , set num over!taga,num=100tag b,set num over!tagb,num=200
對象鎖的同步和非同步
同步 synchronized
同步的概念就是共用,如果不是共用就沒有必要同步。
非同步 asynchronized
非同步概念就是獨立,相互之間不受任何制約。
同步的目的就是就是為了安全執行緒,對於安全執行緒需要滿足兩個特性:原子性(同步),可見度。
package com.wuk.thread;public class ThreadTest03 extends Thread{ public synchronized void method1(){ System.out.println(Thread.currentThread().getName()); try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } } public void method2(){ System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { final ThreadTest03 tt=new ThreadTest03(); Thread thread01=new Thread(new Runnable() { @Override public void run() { tt.method1(); } },"thread01"); Thread thread02=new Thread(new Runnable() { @Override public void run() { tt.method2(); } },"thread02"); thread01.start(); thread02.start(); }}
結果:
同時列印出來,因為這是非同步,相互之間不影響。
thread01thread02
給method1(),method2()同時加上synchronized,這樣兩個方法同步,也就是說只有當線程1執行method1()完畢釋放鎖,線程2才能執行。