博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java面试知识点之线程篇(二)
阅读量:4325 次
发布时间:2019-06-06

本文共 2034 字,大约阅读时间需要 6 分钟。

前言:接上篇,这里继续对java线程相关知识点进行总结。


1.notify和notifyall的区别

notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。

nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,也不能决定哪个线程能够获取monitor。

参考:

2.关于ThreadLocal

ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,但大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。

在中,作者说“在进行get之前,必须先set,否则会报空指针异常”,其实是因为返回值为null,在进行类型转换的时候报出的异常,并不是在进行get前,必须先set,不进行get操作,也可以运行程序,但是必须将long改为Long包装类

参考:

3.线程的几种状态

Thread源码中定义了线程具有以下六种状态:新建状态(NEW)、运行状态(RUNNABLE)、 阻塞状态(BLOCKED)、等待状态(WAITING)、定时等待(TIMED_WAITING)及死亡状态(TERMINATED )。

在我们平时的理解中涉及五种状态:新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)和死亡状态(Dead)。

参考:

4.关于线程池及其创建过程

线程池:帮我们重复管理线程,避免创建大量的线程增加开销。具体相关知识,请参见下面的参考链接。

参考:

5.关于Lock接口

关于Lock可以和synchronized进行一个对比:

1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;

2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;

3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;

4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

5)Lock可以提高多个线程进行读操作的效率。

参考:

6.死锁

当多个线程相互等待已经被对方占用的资源时,就会产生死锁。

如何避免死锁:

1)不要在一条线程中嵌套使用多个锁。

2)不要在一条线程中嵌套占用多个计算机资源。

3)给锁和资源加超时时间:如果非要在一条线程中嵌套使用多个锁或占用多个资源,需要给锁、资源加超时时间,从而避免无限期的等待。

参考:

7.重排序

重排序指的是编译器、处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率。

参考:

8.线程间通信

下面的参考链接给出了几种线程间的通信方式,注意理解。

参考:

注:文中的前两种方式会造成死锁,解决方式加sleep。

9.关于单例模式

单例模式在面试中,出现的概率极高,因为它的实现代码相对较少,因此需要特别注意,推荐使用枚举机制来实现单例模式。

参考:

10.如何保证多线程下 i++ 结果的正确性

如果使用volatile进行变量的修饰,是不能得到预期的结果的,因为volatile只能保证数据的可见性(获取到的是最新的数据,不能保证原子性,即volatile跟原子性没关系),要保证原子性对数据的累加,可以用AtomicInteger类,也可以用synchronized来保证数据的一致性。

参考:

11.阻塞式方法

阻塞式方法是指程序会一直等待该方法完成,期间不做其他事情,ServerSocket的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,异步和非阻塞式方法在任务完成前就返回。

12.Thread类中start()方法和run()方法的区别

只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码,也就说是顺序执行,具有确定性。

参考:


by Shawn Chen,2018.3.27日,下午。


相关内容

转载于:https://www.cnblogs.com/developer_chan/p/8652750.html

你可能感兴趣的文章
蚂蚁金服井贤栋:用技术联手金融机构,形成服务小微的生态合力
查看>>
端口号大全
查看>>
机器学习基石笔记2——在何时可以使用机器学习(2)
查看>>
POJ 3740 Easy Finding (DLX模板)
查看>>
MySQL 处理重复数据
查看>>
关于typedef的用法总结(转)
查看>>
【strtok()】——分割字符串
查看>>
Linux下安装rabbitmq
查看>>
曹德旺
查看>>
【转】判断点在多边形内(matlab)
查看>>
java基础之集合:List Set Map的概述以及使用场景
查看>>
Python 线程 进程 协程
查看>>
iOS语言中的KVO机制
查看>>
excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法
查看>>
响应式web设计之CSS3 Media Queries
查看>>
实验三
查看>>
机器码和字节码
查看>>
环形菜单的实现
查看>>
【解决Chrome浏览器和IE浏览器上传附件兼容的问题 -- Chrome关闭flash后,uploadify插件不可用的解决办法】...
查看>>
34 帧动画
查看>>