synchronized

来源:互联网 发布:常用编程软件有哪些 编辑:程序博客网 时间:2024/06/05 08:21

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(显示锁)用的是乐观锁方式。每次不加锁而是假设没有冲突的去完成某些操作,如果因为冲突失败就重试,直到成功为止。