为什么使用synchronized
在多线程中如果多个线程同时访问某一资源,会造成不可预计的结果。关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块。
synchronized什么时候是对象锁:
当synchronized作用在非静态的方法时是对象锁
synchronized public void getName(){}
1.对象锁的特征:
1.同个对象在多个线程中去调用synchronized作用的代码块,方法时需要获取对象锁。一个对象的对象锁是唯一的,只有一个线程可以拿到,因此当有线程在执行synchronized的方法时,其他线程需要进入阻塞队列等待。
2.同个对象在多个线程中去调用不同的synchronized方法时也是需要等待。
synchronized什么时候是类锁:
1.当synchronized作用在静态方法上
synchronized static public void getName(){}
2.在代码块中调用
synchronized(.class){}
类锁的特征
1.类的不同对象在多个线程中去调用synchronized作用的代码块、方法时需要获取对象锁。一个类的类锁是唯一的,只有一个线程可以拿到,因此当有对象在线程执行synchronized的方法时,其他线程的对象需要进入阻塞队列等待。
2.同个类的不同对象在多个线程中去调用不同的synchronized方法时也是需要等待的。
因此我们可以总结得到:类锁它的范围是类的所有对象,对象锁的范围是同一个对象。
概述:锁分为对象锁和类锁,当synchronized作用在非静态的方法或用对象作为锁时时对象锁,当synchronized作用在静态方法上或用类作为锁时是类锁。
重点:针对对象锁,同个对象在多个线程中去调用不同的synchronized方法是也是需要等待的。
针对类锁,同个类的不同对象在多个线程中去调用不同的synchronized方法时也是需要等待的