Java高并发&多线程

职场@面试 专栏收录该内容
24 篇文章 0 订阅

并发和多线程(线程池、SYNC和Lock锁机制、线程通信、volatile、ThreadLocal、CyclicBarrier、Atom包、CountDownLatch、AQS、CAS原理等等)

1、synchronized、lock,volatile 的原子性问题?

为什么 i++ 这种不支持原子性?
从计算机原理的设计来讲下不能保证原子性的原因,happens before 原理,cas 操作,lock 和 synchronized 的区别?公平锁和非公平锁,Java 读写锁,读写锁设计主要解决什么问题?

2、多线程如何避免死锁,死锁的条件,进程和线程区别

3、如何解决高并发问题,如何解决并发问题(2次)

4、线程的状态 线程的阻塞的方式 sleep和wait的区别wait,sleep分别是谁的方法,区别

这两个方法来自不同的类分别是Thread和Object  
最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。  
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)  
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常  
sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。  
注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程  
 wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生  
 

如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。

需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到wait()/sleep()/join()后,就会立刻抛出InterruptedException。

 

waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronizedblock中进行调用,虽然能编译通过,但在运行时会发生illegalMonitorStateException的异常。

5、countDownLatch的await方法是否安全,怎么改造

安全,避免一直等待阻塞

6、线程池参数,整个流程描述,JDK线程池的创建参数有哪些? JAVA线程池有哪些参数,如果自己设计一个线程池要考虑哪些问题?线程池有哪些参数?分别有什么用?如果任务数超过的核心线程数,会发生什么?阻塞队列大小是多少?数据库连接池介绍下,底层实现说下( J.U.C下的常见类的使用。 ThreadPool的深入考察; BlockingQueue的使用)

线程池的调优策略

答:http://blog.csdn.net/guanyueliuxing/article/details/53585209

初始线程池数,核心线程池数,最大线程池数,存活时间,阻塞队列。

2、为什么要使用线程池?Java 初始化一个线程池有哪些参数可以配置, 分别是什么作用?

3、线程池有什么作用?java线程池, java线程池中基于缓存和基于定长的两种线程池,当请求太多时分别是如何处理的?定长的事用的队列,如果队列也满了呢?交换进磁盘?基于缓存的线程池解决方法呢?

4、说说几种常见的线程池及使用场景。

newFixedThreadPool
创建一个核心线程个数和最大线程个数都为nThreads的线程池,并且阻塞队列长度为Integer.MAX_VALUE,keeyAliveTime=0说明只要线程个数比核心线程个数多并且当前空闲则回收。
newSingleThreadExecutor
创建一个核心线程个数和最大线程个数都为1的线程池,并且阻塞队列长度为Integer.MAX_VALUE,keeyAliveTime=0说明只要线程个数比核心线程个数多并且当前空闲则回收。
newCachedThreadPool
创建一个按需创建线程的线程池,初始线程个数为0,最多线程个数为Integer.MAX_VALUE,并且阻塞队列为同步队列,keeyAliveTime=60说明只要当前线程60s内空闲则回收。这个特殊在于加入到同步队列的任务会被马上被执行,同步队列里面最多只有一个任务,并且存在后马上会拿出执行。
newSingleThreadScheduledExecutor
创建一个最小线程个数corePoolSize为1,最大为Integer.MAX_VALUE,阻塞队列为DelayedWorkQueue的线程池。

5、线程池都有哪几种工作队列?

6、怎么理解无界队列和有界队列?
数组有有界,链表无界
7、线程池中的几种重要的参数及流程说明。

7、背后的底层原理aqs,cas, java cas原理,Java的lock的底层实现?怎么实现一个线程安全的计数器?原子类AtomicInteger实现原理是什么?和你设计的计数器优劣比较?CAS怎么实现原子操作的?Java中的锁有什么?synchronized与Lock的区别?公平锁和非公平底层怎么实现的?AQS原理详细介绍一下?

8、ThreadLocal的使用场景,ThreadLocal原理,注意事项,参数传递,线程池的一些原理,锁的机制升降级(天猫、蚂蚁),threadLocal,线程池,hashMap/hashTable/coccurentHashMap等(天猫)

threadlocal使用时注意的问题(ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享)

9、还有Java的锁( Java有哪些锁种类?(乐观锁&悲观锁、可重入锁&Synchronize等)),内置锁,显示锁,各种容器

10、及锁优化:锁消除,锁粗化,锁偏向,轻量级锁,java有哪些锁?乐观锁 悲观锁(2次) synchronized 可重入锁 读写锁(3次),用过reentrantlock吗?可重入的读写锁,可重入是如何实现的?可重入锁中对应的wait和notify?可重入锁中的lock和trylock的区别?reentrantlock与synmchronized的区别(2次–头条和拼多多) synchronized 和 ReentranLock的区别?

11、数据库锁隐原理(蚂蚁金服网商)

12、1000个线程同时运行,怎么防止不卡(航旅)

13、并列的并发消费问题(航旅)

14、高并发量大的话怎么处理热点,数据等(蚂蚁金服)

15、流量控制相关问题(蚂蚁金服)

16、场景,同时给10万个人发工资,怎么样设计并发方案,能确保在1分钟内全部发完 打个比方会提出类似的场景(信息平台)

17、JDK 中有哪几个线程池?顺带把线程池讲了个遍,JDK 自带的四种线程池、ThreadPoolExecutor 类中的最重要的构造器里面的七个参数,然后再讲了下线程任务进入线程池和核心线程数、缓冲队列、最大线程数量比较。

java封装的几个线程池介绍
FixedThreadPool:
FixedThreadPool并不是一个类,它是由Executors工具类创建出来的一个固定线程数的ThreadPoolEexcutor的对象。
SingleThreadPool:
SingleThreadPool是只有一个线程的线程池,内部实现和FixedThreadPool一样,不过就是线程数有区别。
CachedThreadPool:
一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
ScheduledThreadPoolExecutor:
一个定长线程池,支持定时及周期性任务执行。

18、线程同步,你了解哪几种方式?讲下 Synchronized?讲下 RecentLock 可重入锁? 什么是可重入锁?为什么要设计可重入锁?讲下 Volatile 吧?他是怎样做到同步的?
Volatile 为什么不支持原子性?举个例子。Atomic 怎么设计的?(没看过源码,当时回答错了,后来才发现里面全部用 final 修饰的属性和方法)

19、并发和并行的区别? 进程跟线程的区别

答:http://blog.csdn.net/whl_program/article/details/70217354

20、一个任务分成十个任务,最后汇总计算,不能用fork/join
21、一万个人抢100个红包,如何实现(不用队列),如何保证2个人不能抢到同一个红包,可用分布式锁
22、用过spring的线程池还是java的线程池?
23、定时器用什么做的
24、线程如何退出结束
25、为什么线程执行要调用start而不是直接run(直接run,跟普通方法没什么区别,先调start,run才会作为一个线程方法运行)
26、volatile的用途,volatile关键字用法( volatile关键字有什么用(包括底层原理))
27、static加锁
28、是否用过NIO
29、 java的concurrent包用过没
30、synchronized加在方法上用的什么锁
31、原子类,线程安全的对象,异常的处理方式
32、高并发下,如何做到安全的修改同一行数据?
33、多线程下读概率远远大于写概率,如何解决并发问题?
34、按线程池内部机制,当提交新任务时,有哪些异常要考虑?
35、问用过哪些锁?答互斥锁、读写锁、自旋锁。这些锁有什么区别?应用场景是什么?欸,对自旋锁了解不多。top命令sys、user、idle是什么意思?load是什么意思?怎么计算的?a表示1,b表示11,n个1,使用a、b表示有多少种表示方法?
36、一个有500个用户的广播系统,你怎么做性能优化

答:http://www.techug.com/post/10-tips-for-system-performence-optimize.html
37、扩容问题NIO的原理线程组的一些问题
38、线程通信技术有那几种?
39、高并发的解决方案
40、死锁和并发,高并发的计数器
41、OOD的问题

答:https://www.jianshu.com/p/224d8fc4d0f0
42、 启动线程有哪几种方式,线程池有哪几种?
43、java lock的实现,公平锁、非公平锁
44、乐观锁和悲观锁了解吗?JDK中涉及到乐观锁和悲观锁的内容?
45、多线程JUC包下的一些常见的类,比如CountDownLatch、Semaphore等
46、锁的概念,锁相关的关键字,volatile,synchronized。还比较了ReentrantLock与synchronized。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值