Java 线程面试题 - 京东面试题

多线程实现方法?

继承Thread类创建线程类,重写run方法,run方法就是代表线程需要完成的任务,调用线程对象的start()来启动该线程,线程类已经继承了Thread类,所以不能再继承其他父类。
实现Runnable接口创建线程类,定义Runnable实现类,重写run方法
实现Callable接口,重写call()方法,call()作为线程的执行体,具有返回值
线程池,使用线程池产生线程对象java.util.concurrent.ExecutorService、java.util.concurrent.Executors

Java如何实现线程安全?

互斥同步:推荐使用 synchronized 关键字进行同步, 在 concurrent包中有ReentrantLock类, 实现效果差不多. 还是推荐原生态的synchronized.
非阻塞同步:需要硬件指令完成.常用的指令有:
Test-and-Set
Fetch-and-Increment
Swap
Compare-and-Swap (CAS)
Load-Linked/Store-Conditional (LL/SC)
典型的应用在 AtomicInteger 中
无同步方案:将变量保存在本地线程中,就不会出现多个线程并发的错误了。
java中主要使用的就是ThreadLocal这个类。

Synchronized和lock区别?

Lock提供了synchronized关键字所不具备的主要特性有:
    尝试非阻塞地获取锁boolean tryLock():当前线程尝试获取锁,如果这一时刻没有被其他线程获取到,则成功获取并持有锁
    能被中断地获取锁void lockInterruptibly():当获取到锁的线程被中断时,中断异常抛出同时会释放锁
    超时获取锁boolean trylock(long time, TimeUnit unit):在指定截止时间之前获取锁,如果在截止时间仍旧无法获取锁,则返回
synchronized是JVM提供的加锁,悲观锁;lock是Java语言实现的,而且是乐观锁。
ReentrantLock是基于AQS实现的,由于AQS是基于FIFO队列的实现

Java中都有什么锁?

重量级锁、显式锁、并发容器、并发同步器、CAS、volatile、AQS等

可重入锁的设计思路是什么?

可重入公平锁获取流程
在获取锁的时候,如果当前线程之前已经获取到了锁,就会把state加1,在释放锁的时候会先减1,这样就保证了同一个锁可以被同一个线程获取多次,而不会出现死锁的情况。这就是ReentrantLock的可重入性。
对于非公平锁而言,调用lock方法后,会先尝试抢占锁,在各种判断的时候会先忽略等待队列,如果锁可用,就会直接抢占使用。

什么是乐观锁和悲观锁?

悲观锁:假定会发生并发冲突,则屏蔽一切可能违反数据完整性的操作
乐观锁:假定不会发生并发冲突,只在数据提交时检查是否违反了数据完整性(不能解决脏读问题)

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。