synchronized 同步代码块:
package net.flyingfat.lock; public class SyncLock { public static void main(String args[]){ final SyncLock lock=new SyncLock(); Thread.currentThread().setName("main"); new Thread(new Runnable() { public void run() { Thread.currentThread().setName("sub"); try { Thread.sleep(1000); lock.run2(); } catch (Exception e) { e.printStackTrace(); } } }).start(); lock.run2(); } public synchronized void run2() { try{ System.out.println("thread "+Thread.currentThread().getName()+" : get object lock "); if(Thread.currentThread().getName().equals("main")){ System.out.println("main thread block, release object lock"); this.wait(); //main线程执行到这会一直阻塞,并且释放对象锁,让sub线程能够进入该方法 System.out.println("main thread is notifyed,get object lock again"); }else if(Thread.currentThread().getName().equals("sub")){ this.notify(); //sub线程得到main线程释放的对象锁, 唤醒阻塞的main线程使其往下执行 System.out.println("sub thread notify"); } System.out.println(Thread.currentThread().getName()+" : execute over,release object lock "); }catch(Exception e){ e.printStackTrace(); } } }
ReentrantLock 同步代码实现:
package net.flyingfat.lock; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class ReenLock { ReentrantLock lock=new ReentrantLock(); Condition condition=lock.newCondition(); public static void main(String[] args) { Thread.currentThread().setName("main"); final ReenLock test4=new ReenLock(); new Thread(new Runnable() { public void run() { try { Thread.sleep(1000); test4.run(); } catch (InterruptedException e) { e.printStackTrace(); } } },"sub").start(); test4.run(); } public void run(){ try{ lock.lock(); System.out.println("Thread: "+Thread.currentThread().getName()+" get lock"); if(Thread.currentThread().getName().equals("main")){ System.out.println("main thread block, release object lock"); condition.await(); //main线程执行到这会一直阻塞,并且释放对象锁,让sub线程能够进入该方法 System.out.println("main thread is signaled,get object lock again"); } if(Thread.currentThread().getName().equals("sub")){ condition.signal(); //sub线程得到main线程释放的对象锁, 唤醒阻塞的main线程使其往下执行 System.out.println("sub thread signal"); } }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); System.out.println("Thread: "+Thread.currentThread().getName()+" release lock"); } } }
时间: 2024-10-11 16:30:20