Java-synchronized

synchronized是java的关键字(内置的),Lock是java的接口。两者都实现了对于临界资源的同步互斥访问,各有优缺点。

1.简介

synchronized的使用对象主要有两大类:

  • 静态:类、类方法。
  • 非静态:对象,对象方法。

当多个线程访问了同一个被synchronized修饰的内容时,只有最先获取该内容的锁,其他线程只能等待该线程释放锁(等待或结束)后才能获取该内容的锁。也就是该内容在一段时间内只能被一个线程所拥有。

线程释放锁的情况有三种:

  • 正常执行完被锁的内容,线程释放锁
  • 执行被锁的内容时发生异常,JVM释放锁
  • 进入等待状态(调用wait()方法等),线程释放锁

2.使用

2.1 作用于对象

//代码块
synchronized(this){
  //...
}

//指定对象
synchronized(obj){
  //...
}

//特殊对象,没有明确对象时
private byte[] lock = new byte[0];//特殊对象
......
synchronized(lock){
  //...
}

2.2 作用于方法

//对象方法
public synchronized void method(){
  //...
}
或
public synchronized void method(){
  synchronized(this){
    //...
  }
}

//静态方法
public synchronized static void method(){
  //...
}

2.3 作用于类

synchronized(Clazz.class){
  //...
}

注意

  • synchronized无法被继承,被重写的方法无法同步,父类的方法是同步的。
  • 修饰对象或对象方法时,只在该对象同步,该类的所有对象之间不保持同步。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,660评论 8 265
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,447评论 1 14
  • 你说你想飘。想去看绚烂的七彩路边野花。不让我跟随你快的步伐。 那你大胆的随风飘吧!我就在你身...
    安沐溪ii阅读 293评论 0 0
  • 人与鬼比起来 更可怕的是人
    金箍无咒阅读 249评论 0 0
  • 今天和小伙伴出去探索了一些没有发现的市场,以后希望每天都可以打开新世界。加油!小伙伴们
    W王霞阅读 135评论 0 0