synchronized
synchronized的作用域有两种:
每个对象实例内
synchronized修饰普通方法:synchronized aMethod(){},在同一时刻最多一个线程访问这个对象的synchronized方法(当一个对象存在多个synchronized方法时,只要有一个线程访问了其中的一个synchronized方法,那么其他线程就不能访问这个对象的任何synchronized方法,可以访问没synchronized修饰的方法)。不同的对象实例的synchronized方法是不相干扰的,其他线程照样可以访问相同类的另一个实例中的synchronized方法。
synchronized (this) {…代码块…},表示只对这个区块的资源实行互斥访问。
某个类的范围
synchronized修饰static方法:synchronized static aMethod(){},防止多线程访问这个类的所有对象实例的synchronized static方法
synchronized不被继承:父类的synchronized aMethod(){},通过继承到子类变成 aMethod(){}。
synchronized用在代码块和方法上的区别
- synchronized 用在代码块,锁的是调用该方法的对象(this),也可以选择锁住任何一个对象
- synchronized 用在方法上,锁的是调用该方法的对象
- synchronized 用在代码块可以减小锁的粒度,从而提高并发性能
synchronized 与static synchronized 的区别
- synchronized 是对类的当前实例进行加锁
- static synchronized 是控制类的所有实例的访问
synchronized与lock的区别
- synchronized(隐式锁)采用的是CPU悲观锁机制,即线程获得的是独占锁。其他线程只能依靠阻塞来等待线程锁的释放
- lock(显示锁)用的是乐观锁方式。每次不加锁而是假设没有冲突的去完成某些操作,如果因为冲突失败就重试,直到成功为止。