Synchronized学习大总结

目录

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资源,但是能第一时间抢到锁,但是自适应的自旋锁是等到一定的时间或者重试次数,就停止自旋.之后会总结锁策略的知识点.

你可能感兴趣的:(Java,学习,java)