Java并发面试
Java并发面试
绅士jiejie
理想的生活,就是生活的理想!
展开
-
javap看一下synchronized修饰的同步方法
demo:public class SynchronizedMethod { public synchronized void test() { System.out.println("aaa"); }}通过以下命令反编译一下SynchronizedMethod.class文件:javap -verbose SynchronizedMethod.class结果如下:可以发现synchronized修饰的同步方法是依靠修饰符ACC_SYNCHRONIZED来进原创 2020-07-03 12:25:08 · 380 阅读 · 0 评论 -
面试之一句话简述volatile
volatile是轻量级的synchronized,他保证了可见性,底层的关键主要是LOCK指令,该指令有两个作用,一是强制把处理器缓存写回内存,二是一旦处理器缓存写回了内存,就让其他处理器上相同的缓存失效,这样的话,其他处理器想要修改某个被写回内存的变量,就得重新去内存取值,而这两步可以总结成一句话,就是强制线程读取主内存数据,而不读取工作内存中的数据。...原创 2020-07-01 22:39:00 · 281 阅读 · 0 评论 -
面试题:写两个线程,一个线程打印1~26,另一个线程打印字母A-Z,交替打印数字和字母
参考代码public class SpringbootApplication { static class PrintRunnable implements Runnable { //定义一个锁 private Object lock; public PrintRunnable(Object lock) { th...原创 2020-04-11 20:17:53 · 7170 阅读 · 8 评论 -
面试官:了解锁消除和锁粗化么?
锁消除虚拟机的即时编译器在运行时,会对一些代码上要求是同步的,但被检测到其实不可能存在共享数据竞争的锁进行消除,主要是依据逃逸分析。锁粗化原则上,锁的粒度要尽量小,因为这样可以提高并发度,但是假如一系列的连环操作都是对同一个对象反复加锁,解锁,比如把锁加载在循环体里,单次同步操作的时间也许很短,但是高频反复的锁请求、同步和释放,也会对系统资源造成一定消耗,可能还不如加一把大锁。而锁粗...原创 2020-04-07 21:06:12 · 697 阅读 · 0 评论 -
java并发面试题(八)
说说isInterrupted()方法和interrupted()方法?答:可参考本篇博客【isInterrupted()方法和interrupted()方法简析】。你是如何调用wait()方法的?使用if块还是循环?为什么?答:wait()方法应该在循环调用,因为当线程获取到CPU开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。在线程中你怎么...原创 2020-02-28 18:31:42 · 221 阅读 · 0 评论 -
java并发面试题(十二)
说说什么是公平锁?答:公平锁可以保证线程按照先来后到的顺序去获取锁资源,不会出现抢占现象。说说什么是非公平锁?答:非公平锁无法保证线程按照先来后到的顺序去获取锁资源,很可能后来的线程先得到锁资源。Java中Semaphore是什么?答:Java中的Semaphore是一种新的同步类,它是一个计数信号。Semaphore有什么作用?答:Semaphore就是一个信号量,...原创 2020-03-02 17:52:09 · 181 阅读 · 0 评论 -
java并发面试题(十一)
什么是线程调度器 (Thread Scheduler) ?答:线程调度器是一个操作系统服务, 它负责为Runnable状态的线程分配CPU时间, 一旦我们创建一个线程并启动它, 它的执行便依赖于线程调度器的实现。什么是时间分片(Time Slicing )?答:时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。...原创 2020-02-29 17:37:18 · 296 阅读 · 0 评论 -
java并发面试题(十)
什么是线程局部变量?答:线程局部变量就是局限于线程内部的变量,它是线程自身私有的,不会在多个线程间共享。Java提供 ThreadLocal类来支持线程局部变量,这也是一种实现线程安全的方式。Java中用到的线程调度算法是什么?答:抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。使用synchron...原创 2020-02-29 11:59:58 · 274 阅读 · 0 评论 -
java并发面试题(九)
线程的sleep()方法和yield()方法让出CPU资源后,竞争的线程有什么区别?答:sleep()方法让出CPU资源后,不管优先级高低,其他线程都能得到运行的机会。而yield()方法让出CPU资源后,只有优先级和它相等或比它高的线程可以有机会运行。线程类的构造方法、静态块是被哪个线程调用的?答:线程类的构造方法、静态块是被new这个线程类所在的线程所调用的,而run方法里面的代...原创 2020-02-29 10:34:12 · 270 阅读 · 0 评论 -
java并发面试题(七)
重写run()方法时可以对外抛出异常么?答:不行,因为被重写的run()方法自身就没有抛出异常的定义,所以run()方法里要是有异常,在内部就要try/catch了。线程可以连续调用两次start方法么?答:可参考本篇博客线程连续两次调用start()方法。简述锁的等级方法锁、对象锁、类锁?答:首先要了解每个对象都有一个可以用来实现同步的锁,称为内置锁。方法锁和对象锁指的其实...原创 2020-02-27 18:38:30 · 335 阅读 · 0 评论 -
java并发面试题(六)
在 Java中CycliBarriar和CountdownLatch有什么区别?答:CycliBarriar可以重复使用,而CountdownLatch不行。什么是阻塞式方法?答:阻塞式方法是指程序会一直等待该方法完成,线程会被挂起,在此期间不会做其他事情,直到结果返回。如果同步块内的线程抛出异常会发生什么?答:同步块中无论是正常退出还是异常退出,都会释放锁。如何强制启...原创 2020-02-26 19:07:40 · 316 阅读 · 0 评论 -
java并发面试题(五)
什么是多线程环境下的伪共享(false sharing)?答:在多核的CPU架构中,每个处理器都有自己的局部缓存,缓存系统是以缓存行为单位存储的,当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。同步和异步有何异同?答:同步就是事情必须一件一件的做,下一件事的开始必须在上一件事结束后。异步就是下一件事的开始无需等待上一件事的结束,两件...原创 2020-02-26 11:32:04 · 234 阅读 · 0 评论 -
java并发面试题(四)
java有几种线程?答:java中的线程分为守护线程(Daemon)和用户线程(User)两种。怎么把线程设置为守护线程?答:通过Thread.setDaemon(true)方法可以把线程设置为守护线程。但是这个方法一定要在Thread.start()方法前调用,不能把正在运行的常规线程设置为守护线程,否则在运行时会抛出IllegalThreadStateException异常...原创 2020-02-24 18:23:12 · 296 阅读 · 0 评论 -
java并发面试题(三)
一个线程在运行时发生异常会怎样?答:如果这个异常没有被捕获,这个线程将会停止运行。什么是线程组?答:ThreadGroup类,可以把线程归属到某一个线程组中,线程组中可以有线程对象, 也可以有线程组,组中还可以有线程,它的组织结构有点类似于树,但是它使用起来不安全。Java中的volatile变量是什么?答:volatile变量是java语言提供的一种稍弱的同步机制,它可以用...原创 2020-02-23 18:44:55 · 1349 阅读 · 0 评论 -
java并发面试题(二)
什么是线程安全?答:当多个线程访问同一个对象时,不会产生不确定的结果,就做到线程安全了。哪些集合类是线程安全的?答:Vector,Hashtable,ConcurrentHashMap,Stack。进程间如何通讯?答:管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。有名管道 (na...原创 2020-02-23 17:07:29 · 312 阅读 · 0 评论 -
java并发面试题(一)
什么是进程,什么是线程,进程和线程有什么区别?答:进程是资源调度的最小单位,而线程是CPU调度的最小单位。一个程序下至少有一个进程,一个进程下面至少有一个线程,而一个进程下也开启多个线程来提高执行效率,这就是所谓的多线程。多线程有什么优点?答:...原创 2020-02-23 11:23:04 · 337 阅读 · 0 评论