Java面试知识点之线程篇(二)
前言:接上篇,这里继续对java线程相关知识点进行总结。
1.notify和notifyall的区别
notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。
nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,也不能决定哪个线程能够获取monitor。
参考:
https://www.iflym.com/index.php/code/201208190001.html
http://www.cnblogs.com/dolphin0520/p/3920385.html
http://www.cnblogs.com/xrq730/p/4853932.html
2.关于ThreadLocal
ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,但大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。
在http://www.cnblogs.com/dolphin0520/p/3920407.html中,作者说“在进行get之前,必须先set,否则会报空指针异常”,其实是因为返回值为null,在进行类型转换的时候报出的异常,并不是在进行get前,必须先set,不进行get操作,也可以运行程序,但是必须将long改为Long包装类。
参考:
http://www.cnblogs.com/dolphin0520/p/3920407.html
https://www.cnblogs.com/zhangjk1993/archive/2017/03/29/6641745.html
http://www.cnblogs.com/xrq730/p/4854813.html
http://www.cnblogs.com/swiftma/p/6764821.html
3.线程的几种状态
Thread源码中定义了线程具有以下六种状态:新建状态(NEW)、运行状态(RUNNABLE)、 阻塞状态(BLOCKED)、等待状态(WAITING)、定时等待(TIMED_WAITING)及死亡状态(TERMINATED )。
在我们平时的理解中涉及五种状态:新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)和死亡状态(Dead)。
参考:
http://www.cnblogs.com/skywang12345/p/3479024.html
https://blog.csdn.net/pange1991/article/details/53860651
https://www.cnblogs.com/GooPolaris/p/8079490.html
4.关于线程池及其创建过程
线程池:帮我们重复管理线程,避免创建大量的线程增加开销。具体相关知识,请参见下面的参考链接。
参考:
https://blog.csdn.net/u011240877/article/details/73440993
https://www.cnblogs.com/waytobestcoder/p/5323130.html
http://www.cnblogs.com/xrq730/p/4856453.html
http://www.crazyant.net/2124.html
http://www.cnblogs.com/dolphin0520/p/3932921.html
5.关于Lock接口
关于Lock可以和synchronized进行一个对比:
1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
5)Lock可以提高多个线程进行读操作的效率。
参考:
http://www.cnblogs.com/dolphin0520/p/3923167.html
6.死锁
当多个线程相互等待已经被对方占用的资源时,就会产生死锁。
如何避免死锁:
1)不要在一条线程中嵌套使用多个锁。
2)不要在一条线程中嵌套占用多个计算机资源。
3)给锁和资源加超时时间:如果非要在一条线程中嵌套使用多个锁或占用多个资源,需要给锁、资源加超时时间,从而避免无限期的等待。
参考:
https://blog.csdn.net/u010425776/article/details/54233279
7.重排序
重排序指的是编译器、处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率。
参考:
https://www.cnblogs.com/xll1025/p/6486170.html
8.线程间通信
下面的参考链接给出了几种线程间的通信方式,注意理解。
参考:
https://blog.csdn.net/u010425776/article/details/54341405
http://www.importnew.com/26850.html。注:文中的前两种方式会造成死锁,解决方式加sleep。
https://blog.csdn.net/u011514810/article/details/77131296
9.关于单例模式
单例模式在面试中,出现的概率极高,因为它的实现代码相对较少,因此需要特别注意,推荐使用枚举机制来实现单例模式。
参考:
https://www.jianshu.com/p/fc7fc57d4360
https://blog.csdn.net/gavin_dyson/article/details/70832185
10.如何保证多线程下 i++ 结果的正确性
如果使用volatile进行变量的修饰,是不能得到预期的结果的,因为volatile只能保证数据的可见性(获取到的是最新的数据,不能保证原子性,即volatile跟原子性没关系),要保证原子性对数据的累加,可以用AtomicInteger类,也可以用synchronized来保证数据的一致性。
参考:
11.阻塞式方法
阻塞式方法是指程序会一直等待该方法完成,期间不做其他事情,ServerSocket的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,异步和非阻塞式方法在任务完成前就返回。
12.Thread类中start()方法和run()方法的区别
只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码,也就说是顺序执行,具有确定性。
参考:
http://www.cnblogs.com/xrq730/p/5060921.html
by Shawn Chen,2018.3.27日,下午。
相关内容
Java面试知识点之线程篇(二)的更多相关文章
- Java面试知识点之线程篇(三)
前言:这里继续对java线程相关知识点进行总结,不能间断. 1.yield()方法 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执 ...
- Java面试知识点之线程篇(一)
前言:在Java面试中,一定会遇到线程相关问题,因此笔者在这里总结Java中有关线程方面知识点,多数从网上得来(文中会贴出主要参考链接),有些也是笔者在面试中所遇到的问题,如有错误,请不吝指正.主要参 ...
- Java面试知识点之计算机网络篇(一)
前言:在Java面试中,计算机网络的知识也是一项重点,因此笔者在此对计算机网络的相关知识进行总结. 1.OSI参考模型 自下而上:物理层(物理介质,比特流).数据链路层(网卡.交换机).网络层(IP协 ...
- Java面试知识点之虚拟机篇(一)
前言:Java虚拟机的重要性不言而喻,不管是在实际工作中,还是面试中. 1.JVM架构 要点: 主要了解Java虚拟机运行时数据区:程序计数器.Java虚拟机栈.本地方法栈.Java堆和方法区. 参考 ...
- Java面试知识点之数据库篇(一)
前言:数据库的相关知识,在面试中也经常出现,笔者认为非常有必要对此类知识进行相关总结. 1.索引 索引是对数据库表中一列或多列的值进行排序的结构,是帮助数据库高效获取数据的数据结构. 通俗理解:索引就 ...
- Java面试知识点汇总
Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总 版权声明 ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(三)——JVM篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(四)——版本特性篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
随机推荐
- JS中将变量转为字符串
译者按: 语言的细枝末节了解一下就可以了,不需要太较真,不过如果一点也不知道的话,那就不太妙了. 原文: Converting a value to string in JavaScript 译者: ...
- POJ2155(二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- 记录使用Redis和nginx 实现一个简单的负载均衡(FB)
这两年在博客园看了不少大牛的分享,一直打算能写点什么东西. 之前偶然看见一个利用Redis 当作 Session数据宿主的demo,出处我已经找不到了.后来没事看了看nginx相关的东西.其中负载均衡 ...
- navicate 远程无法链接linux上mysql数据库问题
1. 先确认阿里云是否放开了3306权限 (开启阿里云服务器端口) 2. 连接linux,登录数据库:mysql -uroot -p 修改root用户远程登录权限: 想myuser使用mypasswo ...
- Sql 判断函数是否存在、sql判断表是否存在、sql判断存储过程是否存在、sql判断视图是否存在
--数据库是否存在 IF exists(SELECT * FROM master..sysdatabases WHERE name=N'库名') PRINT 'exists' ELSE PRINT ' ...
- K8S 部署 ingress-nginx (一) 原理及搭建
Kubernetes 暴露服务的有三种方式,分别为 LoadBlancer Service.NodePort Service.Ingress.官网对 Ingress 的定义为管理对外服务到集群内服务之 ...
- 洛谷P3178 [HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
- python 爬虫爬取内容时, \xa0 、 \u3000 的含义
最近用 scrapy 爬某网站,发现拿到的内容里面含有 \xa0 . \u3000 这样的字符,起初还以为是编码不对,搜了一下才知道是见识太少 233 . \xa0 是不间断空白符 我们通常所用的 ...
- WPF控件库:文字按钮的封装
需求:封装按钮,按钮上面只显示文字.在鼠标移上去.鼠标点击按钮.以及将按钮设为不可用时按钮的背景色和前景色需要发生变化 实现:继承Button类,封装如下6个属性: #region 依赖属性 /// ...
- Android TextView自动换行、排列错乱问题及解决
解决之前层次不齐的排版截图,如下图: 解决之后的整齐排版截图,如下图: 今天忽然发现android项目中的文字排版参差不齐的情况非常严重,不得不想办法解决一下 ...