* 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());
}
}