Java多线程

静态方法和普通方法同时加上synchronized有什么区别?

A. 无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。
B. 每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。
C. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

线程池的类型,固定大小的线程池内部是如何实现的,等待队列是用了哪一个队列实现

线程池的底层实现

谈一谈对volatile理解,这个问题很常见,答出要点: 可见性、防止指令重排即可

多线程:创建多线程的三种方法及其区别,线程同步方法,synchronize和ReentrantLock的区别,synchronize的用法(修饰类,方法,代码块等)以及使用对象是什么,sleep和wait的区别

指令重排的含义

volatile 原理 使用 指令重排 内存屏障 保证内存可见性

volatile实现,锁分类介绍、AQS介绍、公平锁非公平锁介绍。

volatile关键字

volatile关键字是Java并发的最轻量级实现,本质上有两个功能,在生成的汇编语句中加入LOCK关键字和内存屏障 作用就是保证每一次线程load和write两个操作,都会直接从主内存中进行读取和覆盖,而非普通变量从线程内的工作空间(默认各位已经熟悉Java多线程内存模型)

但它有一个很致命的缺点,导致它的使用范围不多,就是他只保证在读取和写入这两个过程是线程安全的。如果我们对一个volatile修饰的变量进行多线程下的自增操作,还是会出现线程安全问题。根本原因在于volatile关键字无法对自增进行安全性修饰,因为自增分为三步,读取-》+1-》写入。中间多个线程同时执行+1操作,还是会出现线程安全性问题。

synchronized

锁的优化:偏向锁、轻量级锁、自旋锁、重量级锁
锁的膨胀模型,以及锁的优化原理,为什么要这样设计
与Concurrent包下的Lock的区别和联系

Lock能够实现synchronized的所有功能,同时,能够实现长时间请求不到锁时自动放弃、通过构造方法实现公平锁、出现异常时synchronized会由JVM自动释放,而Lock必须手动释放,因此我们需要把unLock()方法放在finally{}语句块中

concurrentHashMap

两个hash过程,第一次找到所在的桶,并将桶锁定,第二次执行写操作。

而读操作不加锁,JDK1.8中ConcurrentHashMap从1600行激增到6000行,中间做了很多细粒度的优化,大家可以查一下。

锁的优化策略

① 读写分离
② 分段加锁
③ 减少锁持有的时间
④ 多个线程尽量以相同的顺序去获取资源
等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。这部分跟面试官谈了很久

线程池的配置 Excutor 以及Connector的配置

线程池的种类、原理(threadpoolexecutor)、threadpoolexecutor的参数有哪些?

线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。就好比原来去食堂打饭是每个人看谁抢的赢,谁先抢到谁先吃,有了线程吃之后,就是排好队形,今天我跟你关系好,你先来吃饭。比如:一个应用要和网络打交道,有很多步骤需要访问网络,为了不阻塞主线程,每个步骤都创建个线程,在线程中和网络交互,用线程池就变的简单,线程池是对线程的一种封装,让线程用起来更加简便,只需要创一个线程池,把这些步骤像任务一样放进线程池,在程序销毁时只要调用线程池的销毁函数即可。

单个线程的弊端
a. 每次new Thread新建对象性能差
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或者OOM,
c. 缺乏更多功能,如定时执行、定期执行、线程中断。

Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。

Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
(1). newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
(2). newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
(3). newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。ScheduledExecutorService比Timer更安全,功能更强大
(4). newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

线程通信、同步的方法。

Lock 比起 Synchronized 的优势在哪里;读写锁的优势。

锁的类型、重入锁的原理(aqs)、aqs的常用方法

synchronized可重入吗?

synchronized可以替代读写锁吗?

Lock内部实现

终止线程有几种方式?终止线程标记变量为什么是 valotile 类型?

用过哪些并发的数据结构? cyclicBarrier 什么功能?信号量作用?数据库读写阻塞怎么解决

线程的中断

线程的Interrupt中断,其实只是修改线程的中断位,并不会真正停止线程。(1)可以通过Thread的类方法interrupted检查当前线程是否中断,但是会重置标志位(2)通过调用Thread的普通方法isInterrupted来检查中断位,不会重置标志位。

线程调用中断方法不会停止程序,那么有什么用?

谈了谈线程池中,线程销毁,假如没有中断那么就一直while检查不断执行任务。如果中断后,就return方法。就是return Runnable的run方法,线程运行完毕自然就可以销毁。(下来查资料看到真正的中断用法)其实中断线程有很多方法:(1)通过检查标志位用break退出循环(2)通过return退出run方法(3)通过对有些状态中断抛异常退出。

多线程,线程同步,锁

sleep 与 wait 方法的区别

image.png

synchronized 与 volatile 的比较,哪个保证原子性

CountDownLatch

BLOCKED 与 TIMED_WAITING 的区别

Java 多线程机制,锁

自旋锁

redis的配置文件(AOF&&Snapshot&&主从复制)

Java多线程,线程池有哪几类,每一类的差别

ThreadLocal原理,线程池工作流程

synchronized 实现原理

ReentrantLock源码,AQS,synchronized实现

Thread中,ThreadLocal,Lock等

一道线程通信问题,给你三个线程,然后分别处理任务,再交给主线程,你如何实现。

线程池有几种实现方式,分别介绍一下(ThreadPoolExecutor, Executors里面有四种,其实都是调用的ThreadPoolExecutor), Executors中四种实现方式的区别,项目中用的哪种实现方式,我说newFixedThreadPool, 线程数 设置为多大,根据什么依据。这种实现方式下,用的什么阻塞队列,默认队列的长度是多少

ConcurrentHashMap原理,jdk1.8后有哪些改变(引入CAS等)

问为什么项目中需要只用ConcurrentHashMap做缓存,和Redis有什么区别吗(map可以作为内存式缓存,短时间访问量高可以使用)

ConucrrentHashmap原理,Java8做了哪些改变,有引入CAS,问什么是CAS,和自旋锁有什么区别

Redis在项目中怎么使用的,我说做缓存,用户token存放在redis中,有提到在redis中维持一个订单流水号保证唯一性,问为什么redis中可以保证,主要就是redis是单线程的,redis中命令都是原子操作

redis怎么实现分布式锁(sentnx命令可以实现)

线程池怎么实现的?线程池中线程的数量怎么设定? jdk 怎么监控线程状态与线程数量? jstack 打印线程状态,分析线程负载状况? linkedBlockingQuene 与 ArraylistQuene 区别

信号量是什么,怎么使用

阻塞队列了解吗?怎么使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容