1. ReentrantLock 与 synchronized有什么区别?
1.ReentrantLock:是一个类、有公平和非公平两种所类型、采用AQS实现锁机制、通过尝试获取2机制(trylock)灵活、需要手动释放锁(unlock)、可重入锁;
2.synchronnized:是一个关键字、只有公平锁、采用操作系统实现monitor、采用线程抢占模式获取锁、自动释放锁、可重入锁。
2. sleep()和wait()有什么区别?
1、这两个方法来自不同的类分别是Thread(sleep)和Object(wait)
2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3. 乐观锁和悲观锁是什么?
1.乐观锁:形容的是认为在读操作进行时不会有写操作的锁;所以在乐观锁持有资源时不会对读取上锁,但是乐观锁在进行写入操作的时候会判断当前数据是否被修改过;所以乐观锁比悲观锁资源吞吐量大。
Java中的 StampedLock
和AtomicInteger
是一种乐观锁思想的实现。(读的时候允许写)
2.悲观锁:形容的是认为在读的时候,会有写的操作;所以悲观锁在持有资源时不会允许别的线程对资源修改;只有等悲观锁释放资源时才可被修改;所以资源吞吐量相交乐观锁小。
Java
中的 StampedLock
和AtomicInteger
是一种乐观锁思想的实现。
4. 详细说一下sychronized如何实现的?锁升级的过程了解吗?
sychronized:是基于字节码的moitor实现的相关实现比较复杂;
- 3: monitorenter //进入同步方法
- //..........省略其他
- 15: monitorexit //退出同步方法
- 16: goto 24
- //省略其他.......
- 21: monitorexit //退出同步方法
由图可看出是通过monitorenter进入同步区在通过monitorenter离开同步区,当线程进入该同步区时,他的mointor进入计数器会+1,且允许相同线程的重复进入,当重复进入时计数器+1;当其他线程想要获取锁时,mointor会阻塞;只有当上一个线程执行到mointorexit时,此时它会释放锁,并经mointor的计数器设置为0,以便别的线程获取该1mointeor。
锁升级:偏斜锁、轻量级锁、重量级锁(操作系统维持重量级锁需要付出性能代价,所以在不需要重量级锁的条件下使用锁升级机制,也是为了提高系统的资源利率)
当只有一个线程长期的访问时此时只会维持偏斜锁
当有其他线程访问时偏斜锁就会升级为轻量级锁
当有线程并发情况时则会升级为重量级锁
5. 产生死锁的四个条件是什么?
1 : 资源互斥:锁在同一时刻只能被一个线程获取;
2 : 不可释放:当线程在资源未使用完之前不会释放资源;
3 : 请求等待 :线程在获得一个资源时,在等待另外一个资源时不会释放原有资源;
4 : 循环等待 :多个线程相互等待;
解决方案:
1:每次占用不超过一个锁
2:按照相同的顺序使用锁
3:使用信号量