java面试总结-并发-题目与答案

8.多线程的几种实现方式,什么是线程安全

两种方式:继承thread类,实现runnable接口。

9.volatile的原理,作用,能代替锁么。

原理:保证变量变化对其他线程可见。作用:1.防止指令重排序2.

 

10.sleep和wait的区别

       1、sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用。

       2、sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)。

       3、它们都可以被interrupted方法中断。

 

11.sleep和sleep(0)的区别。

   触发操作系统立刻重新进行一次CPU竞争

12.Lock与Synchronized的区别 

       1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;

       2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;

       3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;

       4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,

       如果尝试获取不到锁,线程可以不用一直等待就结束了;

       5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)

       6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

 

 

13.synchronized的原理是什么,一般用在什么地方(比如加在静态方法和非静态方法的区别,静态方法和非静态方法同时执行的时候会有影响吗),

解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁。

   在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,

   在static方法和非static方法前面加synchronized到底有什么不同呢?大家都知道,static的方法属于类方法,

   它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,是属于类的锁。而非static方法获取到的锁,是属于当前对象的锁。所以,他们之间不会产生互斥。

 

14.用过哪些原子类,他们的原理是什么

    incrementAndGet的逻辑:

  1.先获取当前的value值

  2.对value加一

  3.第三步是关键步骤,调用compareAndSet方法来来进行原子更新操作,这个方法的语义是:

    先检查当前value是否等于current,如果相等,则意味着value没被其他线程修改过,更新并返回true。如果不相等,compareAndSet则会返回false,然后循环继续尝试更新。

15.用过线程池吗,如果用过,请说明原理,并说说newCache和newFixed有什么区别,构造函数的各个参数的含义是什么,比如coreSize,maxsize等

       1.newSingleThreadExecutor返回一个包含单线程的Executor,将多个任务交给此Executor时,这个线程处理完一个任务后接着处理下一个任务,若该线程出现异常,将会有一个新的线程来替代。

       2.newFixedThreadPool返回一个包含指定数目线程的线程池,如果任务数量多于线程数目,那么没有执行的任务必须等待,直到有任务完成为止。

       3.newCachedThreadPool根据用户的任务数创建相应的线程来处理,该线程池不会对线程数目加以限制,完全依赖于JVM能创建线程的数量,可能引起内存不足,线程自动回收。

       4.底层是基于ThreadPoolExecutor实现,借助reentrantlock保证并发。

       5.coreSize核心线程数,maxsize最大线程数。

16.线程池的关闭方式有几种,各自的区别是什么

       shutdown:

       1、调用之后不允许继续往线程池内继续添加线程;

       2、线程池的状态变为SHUTDOWN状态;

       3、所有在调用shutdown()方法之前提交到ExecutorSrvice的任务都会执行;

       4、一旦所有线程结束执行当前任务,ExecutorService才会真正关闭。

 

       shutdownNow():

       1、该方法返回尚未执行的 task 的 List;

       2、线程池的状态变为STOP状态;

       3、阻止所有正在等待启动的任务, 并且停止当前正在执行的任务。

 

       简单点来说,就是:

       shutdown()调用后,不可以再 submit 新的 task,已经 submit 的将继续执行

       shutdownNow()调用后,试图停止当前正在执行的 task,并返回尚未执行的 task 的 list

**spring的controller是单例还是多例,怎么保证并发的安全。

 

**ThreadLocal用过么,用途是什么,原理是什么,用的时候要注意什么。

       ThreadLocal线程局部变量 高效地为每个使用它的线程提供单独的线程局部变量值的副本

       ThreadLocalMap是ThreadLocal的一个内部类,不对外使用的。当使用ThreadLocal存值时,首先是获取到当前线程对象,然后获取到当前线程本地变量Map,最后将当前使用的ThreadLocal和传入的值放到Map中,也就是说ThreadLocalMap中存的值是[ThreadLocal对象, 存放的值],这样做的好处是,每个线程都对应一个本地变量的Map,所以一个线程可以存在多个线程本地变量。

       在使用ThreadLocal的时候set完后线程执行完需要显性调用remove方法清除 不然在有线程池模式的WEB服务器下tomcat会出现 内存溢出和用户上下错乱(比如A用户拿到了B用户的SESSION)虽然同一个线程在执行到SET的时候会覆盖之前保留的值但是你无法控制其他人是否在SET之前有调用了。所以一定要在线程执行后remove.

 

**如果让你实现一个并发安全的链表,你会怎么做。

 

**有哪些无锁数据结构,他们实现的原理是什么

       CAS乐观锁 基于jdk提供的原子类原语实现,例如AtomicReference

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值