package com.thread;public class SynWindow implements Runnable { Object object; Object object2; String name; static int count=10; public SynWindow(String name,Object object,Object object2) { // TODO Auto-generated constructor stub this.object = object; this.object2 = object2; this.name = name; } public void serviceWindow() { while(count>0){ synchronized (object) { synchronized (object2) { System.out.PRintln(getName()+"服務"+count+"號客戶"); count-=1; object2.notify(); } try { object.wait(); } catch (Exception e) { // TODO: handle exception } } } } @Override public void run() { // TODO Auto-generated method stub serviceWindow(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { // TODO Auto-generated method stub Object a = new Object(); Object b = new Object(); Object c = new Object(); SynWindow s1 = new SynWindow("窗口一", a, b); SynWindow s2 = new SynWindow("窗口二", b, c); SynWindow s3 = new SynWindow("窗口三", c, a); Thread t1 = new Thread(s1); Thread t2 = new Thread(s2); Thread t3 = new Thread(s3); t1.start(); try { t1.sleep(100); } catch (Exception e) { // TODO: handle exception } t2.start(); t3.start(); }}一段synchronized的代碼被一個線程執行之前,他要先拿到執行這段代碼的權限,在java里邊就是拿到某個同步對象的鎖(一個對象只有一把鎖); 如果這個時候同步對象的鎖被其他線程拿走了,他(這個線程)就只能等了(線程阻塞在鎖池等待隊列中)。 取到鎖后,他就開始執行同步代碼(被synchronized修飾的代碼);線程執行完同步代碼后馬上就把鎖還給同步對象,其他在鎖池中等待的某個線程就可以拿到鎖執行同步代碼了。這樣就保證了同步代碼在統一時刻只有一個線程在執行。
新聞熱點
疑難解答