synchronized,常见的锁策略

synchronized:
  1.synchronized是一个乐观锁,也是一个悲观锁(看锁的竞争程度逐渐升级)
  2.synchronized不是读写锁,是普通的互斥锁
  3.synchronized既是轻量级锁,又是重量级锁(看锁的竞争程度逐渐升级)
  4.synchronized最开始是自旋锁(自旋锁也是轻量级锁),后面逐渐升级
  5.非公平锁
  6.可重入锁 
synchronized的原理:
   1.synchronized的特性
      原子性
      内存可见性
      有序性(指令重排序)
      非公平锁
      可重入锁
      不可中断(不是指线程不能中断,而是指当拿不到锁的时候,这个阻塞的过程不可以中断)
   2.synchronized的使用
      修饰代码块
      修饰普通方法
      修饰静态方法
   3.synchronized的锁机制
      锁升级,锁消除,锁粗化
   4.synchronized的实现
      获取monitor 每个对象都有一个monitor与之关联的monitor = > 监视器锁

synchronized 锁升级:无锁->偏向锁->自旋锁(轻量级锁)->重量级锁
偏向锁:并不是真正的锁,代表对某个线程有一定的偏向,偏向锁是一个标志,在对象头,存储当前锁偏向的线程,当一个线程访问时,会先判断这个标志是否等于当前线程,如果等于当前线程,那就直接获得锁,如果为空,九八当前锁的对象头设置成自己,假如不等于自己,锁就会升级。

常见的锁策略:

 乐观锁和悲观锁
   乐观和悲观是操作数据的一种态度
   乐观:认为这个数据没人改,所以不加锁,在修改之前,判断是否有其他线程对该数据进行了修改,未修            改就进行修改,修改了就停止对数据的操作
   悲观:认为这个数据肯定有线程进行操作,所以在操作前,会先加锁
   乐观锁和悲观锁没有好坏,都有适合的场景

   乐观锁:适合读多写少的场景,更多的是读(没有冲突)
   悲观锁:适合写多读少的场景,对于数据的才做更多的是写(冲突较多)

   synchronized既是乐观锁又是悲观锁
   最开始是乐观锁,随着冲突频率较多,就逐渐变为悲观锁

 读写锁
  对于数据的操作主要是读和写
   1>两个线程,对数据都是读操作 = >线程安全
   2>两个线程,一个读,一个写 = >线程不安全
   只要有写,线程就是不安全的
   基于这个原因,读写锁就出现了:
   读写锁,对数据的操作加锁分为读锁和写锁
   对于数据是读操作,加读锁
                     写操作,加写锁
   读锁+读锁 不互斥
   读锁+写锁 互斥
   写锁+读锁 互斥
   synchronized是普通的互斥锁,不是读写锁

 重量级锁和轻量级锁
   是相对的
   重量级锁,做的比较多,性能比较慢
   轻量级锁,做的比较少,性能也较快
   大多数乐观锁是轻量级锁
              悲观锁是重量级锁   不绝对

   重量级锁大多需要调用mutex互斥锁
   轻量级锁一般不会用到
   synchronized刚开始是轻量级锁,随着冲突增多,会逐渐升级为重量级锁


   自旋锁和挂起等待锁

        自旋锁伪代码:非真实代码
        while(抢锁(lock) == 失败){} 抢锁失败就不断循环,直到抢锁成功
        synchronized最开始也是自旋锁

    公平锁和非公平锁
        synchronized是一个非公平锁
        公平锁:先到先得
        非公平锁:谁抢到谁的
        非公平锁一般情况下要优于公平锁

   重入锁和不可重入锁
         synchronized是一个可重入锁,即自己不会把自己锁死
         不可重入锁:自己会把自己锁死

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值