1.乐观锁和悲观锁本来是数据库中的概念,但是Java锁也有类似的思想。乐观锁:认为数据在正常情况下不会产生冲突。访问记录前不会加独占锁。相反,数据冲突将在数据提交和更新时被检测到。悲观锁:数据被认为是容易访问的。其他线程在处理数据之前修改,加锁,数据在整个数据处理过程中都被加锁2.公平锁,非公平锁公平锁:按照线程申请锁的先后顺序获取锁非公平锁:抢占式获取锁3.Whatisadeadlock如果满足以下四个条件,就会发生死锁:互斥条件:指独占使用已经被一个线程获取的资源,即同一时间该资源只被一个线程占用*。如果此时有其他线程请求获取资源,请求者只能等到持有资源的线程释放资源请求,持有条件:指已经持有至少一个资源的线程,但又提出新的一。资源请求,而新的资源已经被其他线程占用,所以当前线程会被阻塞,但是不会释放自己阻塞时已经获取的资源。不可剥夺条件:是指线程获得的资源在用完之前不能被其他线程使用。线程抢占,资源使用完后自行释放。循环等待:发生死锁时,必然存在一条(线程-资源)循环链,即线程一在等待线程二占用的资源,线程二在等待线程二占用的资源。等待线程三正在等待的资源...例如:publicclassDeadLock{privatestaticObjectobj=newObject();私有静态对象obj2=新对象();publicstaticvoidmain(String[]args)throwsInterruptedException{Threadt=newThread(()->{System.out.println("Thread1,startedtoacquireobj1lock");synchronized(obj){System.out.println("线程1,成功获取obj1锁");System.out.println("线程1,开始获取obj2锁");//休眠让两个线程都获取到对应的锁sleep(1);synchronized(obj2){System.out.println("线程1,获取obj2锁成功");}}});t.开始();Threadt2=newThread(()->{System.out.println("线程2,开始获取obj2锁");synchronized(obj2){System.out.println("线程2,成功获取obj2锁");System.out.println("线程2,开始获取obj1锁");睡觉(1);synchronized(obj){System.out.println("线程2,成功获取obj1锁");}}});t2.开始();t2.join();}publicstaticvoidsleep(longsecond){try{Thread.sleep(second*1000);}catch(InterruptedExceptione){e.printStackTrace();}}}4.如何避免死锁让线程按照指定顺序获取锁并释放锁线程1:锁A锁B线程2:等待A锁C(当A加锁时)线程3:等待A等待B等待C设置获取锁的超时时间。如果超过时间,会自动放弃锁,释放已经持有的锁。使用lock.tryLock(timeount)代替synchronized避免一个线程同时获取多个锁5.什么是活锁?活锁也是一种死锁。可以自己解锁,比如设置重试次数限制,或者超时时间6.sleep、wait、yieldsleep的区别:让当前线程休眠指定时间,不释放锁资源。可以调用interrupt()方法唤醒休眠的线程等待:让当前线程进入等待状态。当其他线程调用notify或notifyAll方法时,当前线程进入就绪状态。当前线程会释放获取到的拿到锁资源,进入等待队列。synchronized中只能使用yield:放弃线程当前CPU执行时间,当前线程进入就绪状态。当前线程没有被阻塞,但是相同优先级或者更高优先级的线程优先执行执行线程下次调度时仍然有可能最多执行7个。什么是虚假唤醒?如何避免https://blog.csdn.net/LuckyBu...wait(),notify()源码分析:https://www.jianshu.com/p/f44...8。同步原理同步可以修改普通方法、同步方法块、静态方法;普通方法锁是当前实例对象静态方法锁是当前类的Class对象;同步方法blocklock是Synchonized配置的对象;使用的锁保存在对象头中,根据markword的锁状态来判断锁。如果锁只被同一个线程持有,则使用偏向锁。不同线程相互交替持有锁,使用轻量级锁。多线程竞争使用重量级锁。)->轻量级锁(双线程竞争)->重量级锁(多线程竞争)升级,称为锁扩展https://github.com/farmerjohn...9.synchronized和Locksynchronized的区别是JavaA内置关键字,Lock是一个Java类synchronized。无法显式确定是否获取锁。Lock可以判断是否获取到锁。synchronized会自动释放锁。最后需要手动释放锁。如果获取成功,其他线程将被阻塞,直到获取到锁。Lock有阻塞锁和非阻塞锁。拦截锁还有试用设置,功能比较强大。判断,有公平锁和非公平锁。Lock锁适用于有大量同步代码的同步问题。同步锁适用于代码量小的同步问题。10.synchronizedreentrancy是如何实现的reentrancy指的是:当一个线程持有一个锁对象后,再次获取同一个锁可以成功获取。因为synchronized使用了锁对象,当线程第一次持有锁时,会修改锁对象的markword锁状态为偏向锁,偏向锁会在当前线程的栈帧中创建一个锁记录空间thread,markword会把指针指向栈上的锁记录。当线程再次获取锁对象时,会检查markword中的指针是否指向当前线程的栈帧。如果是,则直接获取锁。如果不是,则需要竞争11.ReentrantLock的可重入是如何实现的?由于ReentrantLock是通过AQS实现的,它使用AQS的状态值来表示线程获取锁的重入次数。默认状态为0,表示当前锁没有被任何线程持有。当一个线程获取到锁加锁时,会尝试使用CAS将state值设置为1,如果CAS设置成功,则当前线程获取到锁,然后记录锁持有者为当前线程,并且在不释放锁的情况下第二次获取锁。加锁后status值设置为2,也就是重入次数。释放锁时,需要通过CAS将status值减1,直到status值为0,即当前线程释放锁。队列简称AQS,是实现同步器的基础组件。并发包中的锁都是基于它的实现。关键是先进先出队列,state状态,并定义了ConditionObject。它有两种线程模式,独占模式和共享模式。AQS模式的核心思想如果请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态。如果请求的共享资源被占用,则需要线程阻塞等待和唤醒时分配锁的机制。这种机制是使用CLH队列实现的,暂时无法获取到锁的线程被加入到队列中没有队列实例,只有节点之间的关联关系)。AQS将每个请求共享资源的线程封装到一个CLH锁队列的一个节点(Node)中实现锁分配,并维护上下节点,当前请求资源的线程13.非公平锁和公平锁在ReetrantLock中的实现过程是怎样的如果一个锁是公平的,那么锁的获取顺序应该符合请求的绝对时间顺序,先进先出。对于非公平锁,只要CAS设置同步状态成功,就说明当前线程已经获取到了锁,而公平锁还需要判断当前节点是否有前驱节点。如果是,说明一个线程比当前线程更早请求获取锁,所以需要等待前一个线程获取并释放锁,然后再继续获取锁。14、自旋锁、自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁、重量级锁概念自旋锁:开启线程执行一个忙循环,直到需要更新的值为期望值自适应自旋:自旋时间不再是固定的,它是由同一把锁上的前一次自旋时间和锁拥有者的状态决定的。比如在同一个锁对象上,自旋等待刚刚成功获取到锁。而持有锁的线程正在运行,那么虚拟机会认为这次自旋很可能再次成功,然后自旋等待更长时间才能成功获取锁,如果很少成功获取锁,很可能会忽略自旋进程,以免浪费CPU资源。消除锁:JIT运行时,需要对部分代码进行同步,但检测到没有共享数据竞争的可能,将锁同步的范围扩展到整个外部轻量级锁序列:锁是通过同步对象的对象头进行操作的,首先会在当前线程的栈帧中创建一个名为锁记录的空间,用于存放锁对象的当前MarkWord副本,会添加Displaced前缀,然后尝试通过CAS将对象的MarkWord更新为指向LockRecord的指针。如果成功,将获得对象的锁。如果失败,会检查MarkWord是否指向当前线程的栈帧?如果是,则表示已获取锁。如果没有,说明其他线程已经抢占了它,轻量级锁就会扩展成重量级锁。解锁也是由CAS进行的,就是将MarkWord替换为原来的值偏向于锁:锁偏向于第一个获得它的线程。如果在后续执行过程中没有其他线程获取到锁,则持有偏向锁的线程永远不需要重新同步。-XX:+UseBiasedLocking启用偏向锁重量级锁:也叫互斥锁,一种阻塞线程的悲观锁,通过对象内部的监视器锁来实现。监听锁依赖底层操作系统的MutexLock互斥锁来实现15.JDK8新加入的锁StampedLock提供三种模式的读写控制。在调用一系列函数获取锁时,会返回一个long变量,支持在一定条件下三种模式的相互转换。writelockwriteLock:一行锁或者独占锁,写锁不可重入悲观读锁readLock:共享锁,在没有线程独占获取写锁的情况下,多个线程可以同时获取锁,如果其他线程已经持有写锁,那么其他请求读锁的线程就会被阻塞。乐观读锁tryOptimisticRead:操作数据前,不通过CAS设置锁的状态,仅通过位操作测试
