1. 程式人生 > >java併發程式設計(二)多個執行緒多個鎖

java併發程式設計(二)多個執行緒多個鎖

多個執行緒多個鎖

多個執行緒多個鎖:多個執行緒,每個執行緒都可以拿到自己制定的鎖,分別獲得鎖之後,執行synchronized方法體的內容。就是在上次那個部落格上說道的鎖競爭的問題,是因為所有的執行緒過來以後都爭搶同一個鎖。如果說每個執行緒都可以或得到自己的鎖,這樣的話我們的鎖競爭問題就沒有了,如果這樣做的話,我們去例項化一個物件,我們怎麼可以保證多執行緒可以並行操作,並行操作完成之後又不會相互之間影響。最終的操作結果就是一樣的,最簡單的就是在類上面加上static,或者使用原子的方式,來避免鎖競爭問題。

示例程式碼

package nihui.test.cn;

public class MutliThread {
	private static int num = 0;
	/** static */
	public static 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");
			}
			System.out.println("tag" + tag + "num" + num);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {		
		final MutliThread m1 = new MutliThread();
		final MutliThread m2 = new MutliThread();		
		Thread t1 = new Thread(new Runnable() {		
			@Override
			public void run() {
			    m1.printNum("a");
			}
		});		
		Thread t2  = new Thread(new Runnable() {			
			@Override
			public void run() {
				m2.printNum("b");				
			}
		});		
		t1.start();
		t2.start();	
	}
}

執行結果


示例總結:

關鍵字synchronized獲取到的鎖都是物件鎖,而不是把一段程式碼(方法)當做鎖,所以示例程式碼中那個執行緒先執行synchronized關鍵字的方法,那個執行緒就持有該方法所屬的物件鎖Lock,兩個物件,執行緒獲得就是兩個不同的鎖,他們互不影響。

有一種情況則是相同的鎖,即在靜態方法上夾上synchronized關鍵字,表示鎖定.class 類,類一級別的鎖(獨佔.class類)