* synchronized的使用,其实是对象锁,可以锁定方法(对当前对象锁定),也可以锁定代码块(锁定单独的对象)
* 1 当n个线程同时执行对一个对象锁定的代码块时,则同一时间只能有一个线程执行
*
* 场景设想:
* 有一个车主想要出租自己的一个车(一个对象锁),
* 可是有5个人同时想租这个车主的车(5个线程)
* 那么这5个人按顺序分别租这个人的车,每个人租赁完成,下一个继续租(5个线程分别执行这段代码)
1 代码块的锁(可以是一个对象或者是class),锁定的是一个对象,则同时只能有一个线程执行这个代码块
public class TestSyn implements Runnable{ private Integer counter=0; private String waitLock ; public TestSyn( String waitLock, int counter2 ) { this.counter = counter2 ; this.waitLock = waitLock ; } public static void main(String[] args) { String waitLock =""; for(int i=0;i<3;i++){ TestSyn d = new TestSyn( waitLock,i); new Thread(d).start(); } } @Override public void run() { //所有的线程都获得waitLock对象的锁,所以同一时刻只能有一个线程执行代码块 //与括号中放TestSyn.class是相同的 ,其实TestSyn.class也是一个对象 synchronized (waitLock ) { System.out.println("子线程启动=="+counter); try { Thread.sleep(5000); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("子线程结束"+counter); } } }
结果:一个一个执行
子线程启动==0 子线程结束0 子线程启动==2 子线程结束2 子线程启动==1 子线程结束1
2 方法锁,锁定的是当前对象,则N个线程同时执行这个对象的同步方法,只能有一个线程执行方法
设想场景同上。
public class TestSyn2 implements Runnable{ private CarOwner owner ; public TestSyn2( CarOwner owner ) { this.owner = owner ; } public static void main(String[] args) { CarOwner owner = new CarOwner(); for(int i=0;i<3;i++){ //创建3个租车的人,每个人都需要和车主租车 TestSyn2 renter = new TestSyn2( owner );// new Thread(renter).start(); } } @Override public void run() { //打印说明线程是同步开始的 System.out.println( "当前线程开始"+Thread.currentThread().getName()); owner.rentCar(); //System.out.println( "当前线程结束"+Thread.currentThread().getName()); } } //车主 class CarOwner{ //线程工作 public synchronized void rentCar(){ //统一时刻只能有一个线程执行这个方法 System.out.println( "同步当前线程开始"+Thread.currentThread().getName()); try { Thread.sleep(5000); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println( "同步当前线程结束"+Thread.currentThread().getName()); } }