1.多线程

2.并发

  1.锁的详细介绍:https://www.cnblogs.com/jyroy/p/11365935.html

  

 

1. 乐观锁 VS 悲观锁

  1.乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度

  2.对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。

  3.而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作。CAS算法。

2.CAS算法:

  1.全称 Compare And Swap(比较与交换),是一种无锁算法。在不使用锁的情况下实现多线程之间的变量同步。

  2.java.util.concurrent包中的原子类就是通过CAS来实现了乐观锁。

  3.各属性的作用:

    1.unsafe: 获取并操作内存的数据。
    2.valueOffset: 存储value在AtomicInteger中的偏移量。
    3.value: 存储AtomicInteger的int值,该属性需要借助volatile关键字保证其在线程间是可见的

  4.优缺点:无阻塞,比较耗cpu,ABA。(在锁占用时间小的情况下使用效果非常好,反之浪费cpu性能)可以设置自旋次数的限制。

3.synchronized:

  1在对象头加锁:

    1.Mark Word(标记字段):默认存储对象的HashCode,分代年龄和锁标志位信息

    2.Class Pointer(对象指针):对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

  2.Monitor:同步工具-->monitor锁。

    1.Monitor是线程私有的数据结构,每一个线程都有一个可用monitor record列表,同时还有一个全局的可用列表。每一个被锁住的对象都会和一个monitor关联,同时monitor中有一个Owner字段存放拥有该锁的线程的唯一标识,表示该锁被这个线程占用。

    2.Monitor是依赖于底层的操作系统的Mutex Lock(互斥锁)来实现的线程同步。

  3.synchronized级别从低到高依次是:无锁、偏向锁、轻量级锁和重量级锁。锁状态只能升级不能降级。

    1.无锁:无锁没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。

    2.偏向锁:偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价。

    3.轻量级锁:是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。

    4.当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁升级为重量级锁

    综上所述:

    1.偏向锁通过对比Mark Word解决加锁问题,避免执行CAS操作。

    2.而轻量级锁是通过用CAS操作和自旋来解决加锁问题,避免线程阻塞和唤醒而影响性能。

    3.重量级锁是将除了拥有锁的线程,其余的线程都阻塞。

  4.Lock是一个接口

    1.lock()、tryLock()、tryLock(long time, TimeUnit unit)和lockInterruptibly()是用来获取锁的。unLock()方法是用来释放锁的。公平锁和非公平锁,读写锁,都是可重入锁。

    3.Synchornized和Lock的使用场景的区别:https://www.pianshen.com/article/6599332596/

        https://www.cnblogs.com/shoshana-kong/p/10877212.html

    4.Synchornized和Lock的性能比较:https://www.cnblogs.com/jiangds/p/6476293.html

  5.volatile

    1.

    2.