Synchronized学习大总结

synchronized是Java中的互斥锁,具备乐观锁和悲观锁特性,可以防止数据不一致。它可以是轻量级锁(自旋锁)或重量级锁(挂起等待)。使用时,可以通过对象或this进行加锁,实现代码块的原子性。锁的升级过程包括偏向锁、轻量级锁到重量级锁,自旋锁在竞争激烈时会转为重量级锁,以减少CPU资源浪费。
摘要由CSDN通过智能技术生成

目录

1.synchronized特性

2.synchronized如何使用

3.synchronized的锁机制


1.synchronized特性

     synchronized 是乐观锁,也是悲观锁,是轻量级锁(j基于自旋锁实现),也是重量级锁(基于挂起等待锁实现),它不是读写锁,是互斥锁,当一个线程抢到锁之后,其它线程阻塞等待,进入synchronized关键字修饰的代码块相当于加锁,出代码块相当于解锁.,它对同一锁对象加锁两次不会造成死锁,所以它是可重入锁,它加锁不遵循先来后到原则,所以是非公平锁.


2.synchronized如何使用

     可以将一块修改操作变成原子的,需要有一个锁对象(相当于一个吉祥物),针对它进行加锁.示例代码如下,加锁方式分为两种:

      ① 方式一

    //锁对象(继承自Object类的对象,不能是基本数据类型)
    static Object o = new Object();
    synchronized (o) {
             if(flag == 0) {
                  System.out.println("a");
                  flag = -1;
                  o.notifyAll();
             } else {
                  try {
                  o.wait();
             } catch (InterruptedException e) {
                  e.printStackTrace();
             }
                   
    }

      ② 方式二

    //对++操作进行加锁(锁对象为this引用指向的对象)
    synchronized public void add() {
        count++;
    }

3.synchronized的锁机制

     如图,synchronized加锁先加的是偏向锁,简单来说,偏向锁就是标记了一下这个锁对象是哪个线程的,等发生锁竞争的时候,该线程立马就抢到这个锁,然后转变为轻量级锁(自适应的自旋锁),等锁竞争激烈起来的时候会转变为重量级锁.

注:自旋锁不停地死等,很浪费CPU资源,但是能第一时间抢到锁,但是自适应的自旋锁是等到一定的时间或者重试次数,就停止自旋.之后会总结锁策略的知识点.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值