我们在提到线程安全的时候,会选择锁的方法来进行解决。在java中锁的类型对应被分成了六种,我们接触了两种最多的锁方法是lock和synchronized,这也是面试中最常问到的原理和作用机制题目。下面我们就Java中锁的常见面试题带来展示,大家也来看一看自己能否全部答出。
1.synchronized作用于静态方法和非静态方法的区别
非静态方法:
给对象加锁(可以理解为给这个对象的内存上锁,注意 只是这块内存,其他同类对象都会有各自的内存锁),这时候在其他一个以上线程中执行该对象的这个同步方法(注意:是该对象)就会产生互斥
静态方法: 相当于在类上加锁(*.class位于代码区,静态方法位于静态区域,这个类产生的对象公用这个静态方法,所以这块内存,N个对象来竞争),
这时候,只要是这个类产生的对象,在调用这个静态方法时都会产生互斥。即该类所有的对象都共享一把锁。
2.锁类型有哪些
(1)乐观锁&悲观锁
(2)自旋锁&非自旋锁
(3)可重入锁&不可重入锁
(4)无锁&轻量级锁&偏向锁&重量级锁
(5)互斥锁&共享锁
(6)公平锁&非公平锁
3.线程同步的几种方式
synchronized修饰
volatile实现同步(只能保证可见性,不能保证原子性)
使用局部变量ThreadLocal
使用原子类(AtomicInteger、AtomicBoolean……)
使用Lock
使用容器类(BlockingQueue、ConcurrentHashMap)
4.synchronized 和 lock 机制区别
synchronized 原始采用的是 CPU 悲观锁机制,即线程获得的是独占锁。独占锁意味着其 他线程只能依靠阻塞来等待线程释放锁。
Lock 用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是 CAS 操作(Compare and Swap)。
5.说说线程安全的问题
线程安全是多线程领域的问题,线程安全可以简单理解为一个方法或者一个实例可以在多线程环境中使用而不会出现问题。
在 Java 多线程编程当中,提供了多种实现 Java 线程安全的方式:
最简单的方式,使用 Synchronization 关键字
使用 java.util.concurrent.atomic 包中的原子类,例如 AtomicInteger
使用 java.util.concurrent.locks 包中的锁
使用线程安全的集合 ConcurrentHashMap
使用 volatile关键字,保证变量可见性
以上就是Java中锁的面试题介绍,大家对于自己不清楚的知识点,一定要及时的找资料进行解决,加强有关锁内容的记忆。更多Java学习指路:java教程