多线程与高并发

1. synchronized 四种状态以及锁升级过程

无锁 -> 偏向锁 -> 轻量级锁(cas) -> 重量级锁

  1. 当只有一个线程进行加锁的时候,默认会使用偏向锁
  2. 一旦有线程竞争就会升级成轻量级锁(未获得锁的线程会通过自旋等待获取锁,占用cpu资源)
  3. 默认自旋超过10次还未获取锁会升级为重量级锁

2. synchronized 和ReentrantLock区别

  1. synchronized使用的是锁升级的方式加锁,ReentrantLock使用的是cas
  2. ReentrantLock可以使用tryLock进行尝试加锁,synchronized只能等待获取锁
  3. ReentrantLock需要手动加锁(lock)解锁(unlock),synchronized代码执行完成自动解锁
  4. ReentrantLock可以创建不同的Condition,实现不同的等待队列,更好的实现生产者消费者模式

3. volatile有什么作用,分别是怎么实现的

  1. 线程之间可见(缓存一致性协议 EMSI)
  2. 禁止指令重排序(内存屏障 ll ss ls sl)

4. cas

Compare and Swap 比较再交换
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

自旋的ABA 问题如何解决?基础类型的操作如果没特殊要求可以不用进行处理,对象或有特殊要求的可以使用版本号进行比较

5. 线程的状态

  1. new 还未start的线程
  2. RUNNABLE 正在执行的线程 有可能是正在等待cpu的调度,有可能是正在运行
  3. BLOCKED 未获取到锁的
  4. WAITING 等待 wait join LockSupport.park
  5. TIMED_WAITING 有时效性的等待 sleep(long) wait(long) join(long) 等
  6. TERMINATED 执行结束

6. Runnable接口和Callable接口的区别?

  1. Runnable接口中的run()方法的返回值是void
  2. Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

7. 如何在两个线程之间共享数据

8. 单例模式中的双重锁机制(DCL),对象是否需要添加volatile修饰,作用是什么?

必须添加volatile修饰,禁止指令重排序,如果不加有可能获取到一个半初始化状态的对象,对象初始化:1.分配内存,初始化成员变量2.给成员变量赋值3.将内存地址指向对象 。如果不加volatile的话指令重排序后有可能执行顺序是1,3,2.步骤3执行过后对象就不是一个空对象,但是成员变量还未赋值,拿到的就是一个半初始化状态的对象。

9. 写一段程序,两个线程交替打印A1B2C3……

线程之间通讯

  1. wait notify
  2. LockSupport park unPark
  3. volatile + cas
  4. 使用SynchronousQueue空队列交换数据打印

10. notify 和 notifyAll有什么区别

notify唤醒一个在等待的线程,并不能指定唤醒线程,notifyAll唤醒所有等待的线程

11. 公平锁和非公平锁的区别

  1. 公平锁在新线程需要获取锁的时候会先检查等待队列是否有其它阻塞线程,如果有,则加入到等待队列。
    优点:所有线程都会获取锁
    缺点:线程唤醒的代价比较大,影响效率
  2. 非公平锁在新线程获取锁的时候不需要检查等待队列,直接参与竞争锁,如果能获取到就获取锁,如果获取不到,就加入等待队列
    优点:可以减少cpu唤起线程的开销
    缺点:可能导致某些线程一直获取不到锁

12. 共享锁,排它锁 ReadWriteLock

13. AQS

state 线程的重入数 大于0被线程所占用
node双向链表,等待队列

14. Varhandle jdk1.9新增

  1. 比反射速度快
  2. 直接操作二进制码
  3. 可以直接修改属性值,普通对象也可以进行原子操作,多线程安全操作
    使用的cas

15. ThreadLocal

每一个线程独有一个ThreadLocalMap,确保线程之间数据互不影响。
使用场景,声明式事务管理,每一个线程独有一个数据库连接,确保每一个线程在同一个事务。
ThreadLocalMap使用弱引用,当threadlocal强引用被回收之后,map的key弱引用也会被回收,value不会被回收,因此在使用完ThreadLoca后要把相关的value remove掉,以免造成内存泄露。

16. 对象的引用类型


  1. 强引用,普通new一个对象就是强引用,当对象使用完成或者对象为空时就会被gc回收

  2. 软引用,当虚拟机内存不够时就会被gc回收,一般用作缓存使用

  3. 弱引用,会立马被gc回收,但是同时有一个强引用指向时不会被回收,当强引用被回收后就会立马被回收,使用场景,ThreadLocalMap的key

  4. 虚引用,当内存被回收时会被加入到一个队列里面,可以对队列进行监听以达到获取通知的作用
    使用场景:管理堆外内存,gc不能回收堆外内存,获取到回收通知后手动对堆外内存进行回收。
    netty使用的就是堆外内存
    java的unsafe类可以直接操作堆外内存

17. 容器(Collection Map Queue)

  1. HashTable HashMap SynchronizedMap LinkedHashMap TreeMap ConcurrentHashMap ConcurrentSkiplistmap
  2. Vector ArrayList LinkedList SynchronizedList CopyOnWriteArrayList
  3. HashSet TreeSet
  4. ConcurrentLinkedQueue LinkedBlockingQueue ArrayBlockingQueue PriorityQueue DelayQueue SynchronousQueue TransferQueue

18. List和Queue的区别

Queue提供了对多线程操作的一些api,类如offer poll(取出一个,从队列里面移除) peek(取出一个,不从队列里面移除)
BlockQueue put阻塞,当队列已满时会阻塞,offer 当队列已满时会返回false,可以设置等待时间,add 当队列满了会抛出异常

19. CompletableFuture

管理多个线程的返回结果
allof 所有线程都获取到结果
anyof 任意一个线程获取到结果
……

20. callable future futuretask

21. 线程池7个参数

  1. corePoolSize
    核心线程数
  2. maximumPoolSize
    最大线程数
  3. keepAliveTime
    空闲线程会根据存活时间进行销毁,默认是非核心线程数,设置了allowCoreThreadTimeOut时,核心线程也会销毁
  4. unit
    时间单位
  5. workQueue
    等待队列,当最大线程数不够用时,会将线程加入等待队列
    LinkedBlockingQueue Integer.MAX 长度
    SynchronousQueue 空队列
    ArrayBlockingQueue 固定长度
  6. threadFactory
    线程的创建工厂 定义线程的组和名字等 创建线程一定要自定义一个有意义的名字,以方便jstack 排查问题
  7. RejectedExecutionHandler 拒绝策略,当线程数和等待队列都满了之后的拒绝策略,jdk 提供了四种
    AbortPolicy 直接抛出异常
    DiscardPolicy 什么事情都不干,直接丢弃掉
    DiscardOldestPolicy 丢弃掉队列中最早的
    CallerRunsPolicy 交给发起者执行,比如main线程调用,就交给main线程执行
    实际场景中一般都是自定义,比如存储到redis,mq,数据库等,避免数据丢失
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容