复习整理篇-Synchronized关键字

原子性:一个操作/一系列操作
可见性:当一个线程修改了共享属性的值后,其它线程能立刻看到共享属性值的更改。
有序性:程序的运行顺序看起来和我们编写逻辑的顺序一致,但计算机在实际执行中却不一定。


Synchronized关键字

一.作用

  保证同一时刻最多只有1个线程执行被Synchronized修饰的方法/代码;
  其它线程必须等待当前线程执行完该方法/代码块后才能执行该方法/代码块。

二.应用场景

 保证线程安全,解决多线程中的并发同步问题(实现的是阻塞型并发)
  a.修饰实例方法/代码块时,(同步)保护的是同一个对象方法的调用&当前实例对象
  b.修饰静态方法/代码块时,(同步)保护的是静态方法的调用&class类对象

  修饰的非静态方法,锁的是this对象
  修饰的静态方法,锁的是class对象

三.原理

  a.依赖JVM实现同步;
  b.底层通过一个监视器对象(monitor)完成,wait(),notify()等方法也依赖于monitor对象。

  监视器锁(monitor)的本质依赖于底层操作系统的互斥锁(Mutex Lock)实现

四.具体使用

使用规则:

 1.锁对象设置:
  ·修饰代码块时,需1个reference对象作为锁的对象
  ·修饰实例方法时,默认的锁对象=当前对象
  ·修饰类方法(静态)时,默认的锁对象=当前类的class对象

 2.根据锁对象的不同,一把锁同时最多只能被一个线程持有
  ·若目标锁已被当前线程持有,其它线程只能阻塞等待当前线程释放目标锁;
  ·若当前线程已持有目标锁,其它线程仍然可以调用目标类中无被synchronized修饰的方法

 3.当对象获取多个锁时,必须以相反的顺序释放&在与所有锁被获取时相同的词法范围内释放所有锁
  ·若线程进入由线程已拥有的监控器保护的synchronized块,就允许线程继续执行;
  ·只有线程退出它进入的监控器保护的第1个synchronized时,才释放锁。

 4.特别注意:
  (1)Java类中,实例对象会有多个,但只有1个class对象
    ·即类的不同实例,共享该类的class对象
    ·实际上,class对象也属于Java对象,只是有点特殊
  (2)静态方法&实例方法上的锁默认不一样
    ·若同步则需制定两把锁
    ·静态方法加锁,能和所有其它静态方法加锁的进行互斥【直接属于类,效果同xx.class锁】

五.特点

 1.保证原子性、可见性和有序性

  可见性
    ·释放锁时,所有写入都会写入内存
    ·获得锁后,都会从内存读取最新数据

 2.可重入性
  (1)对同一个线程在获得锁后,在调用其它需同样锁的代码是可直接调用
  (2)原理
    ①记录锁的持有线程&持有数量
    ②调用synchronized代码时检查对象是否已经被锁
      ·是,则检查是否被当前线程锁定&若是,计数加1
      ·不是,则加入等待队列

 3.重量级
  ·底层通过一个监视器对象(monitor)完成→wait(),notify()等方法也依赖于monitor对象。
  ·监视器锁(monitor)的本质依赖于底层操作系统的互斥锁实现→而操作系统实现线程切换需从用户态转换到内核态
  ·上述切换过程较长→所以synchronized效率低&重量级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值