【Todo】Java线程面试题 Top 50 (转载)
原文链接:http://www.importnew.com/12773.html
这里有一个排版好看一点的:http://www.cnblogs.com/dolphin0520/p/3958019.html
看过上面这篇,还有这一篇:http://www.tuicool.com/articles/VRVFZb 《40个多线程问题总结》
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。
在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口)
注:
1. 实现Runnable接口,可以再多继承其他的类,这一点比继承thread更好。
2. 继承thread,多线程是new多个子类的实例;实现Runnable,是new 一个实现了Runnable的实例,创建多个Thread实例,把Runnable实例传进去。
大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。
这样,多个Thread实例,就共享了Runnable实例的数据。(但是强烈不推荐Runnable实例里面放数据,同步机制不完善,同样需要考虑同步的)
参考这里(Link), Run方法也是可以加上synchronized的,表示对对象加锁。
见例子:
class MyRunnable implements Runnable { int x = 5;
@Override
public void run() {
for (int i=0; i<5; i++) {
System.out.println("hi " + Thread.currentThread().getName() + ":" + x--);
}
}
} public class Main { public static void main(String[] args) throws InterruptedException { MyRunnable mr = new MyRunnable();
Thread t1 = new Thread(mr, "1");
Thread t2 = new Thread(mr, "2");
Thread t3 = new Thread(mr, "3"); t1.start();
t2.start();
t3.start(); System.out.println(); }
}
结果:
hi 1:5
hi 2:4
hi 1:3
hi 1:1
hi 1:0
hi 3:-1
hi 3:-3
hi 3:-4
hi 3:-5
hi 3:-6 hi 2:2
hi 2:-7
hi 2:-8
hi 2:-9
hi 1:-2
发现是混乱的。
而如果对run方法加上synchronized,如下:
public synchronized void run() {
......
} 结果:
hi 1:5
hi 1:4
hi 1:3
hi 1:2
hi 1:1
hi 2:0
hi 2:-1
hi 2:-2
hi 2:-3
hi 2:-4
hi 3:-5
hi 3:-6
hi 3:-7
hi 3:-8
hi 3:-9
可以看到,是线程1先打印5个,然后线程2打印。因为加锁了。
然后逐渐问到并发问题像在Java并发编程的过程中遇到了什么挑战,Java内存模型,JDK1.5引入了哪些更高阶的并发工具,并发编程常用的设计模式,经典多线程问题如生产者消费者,哲学家就餐,读写器或者简单的有界缓冲区问题。仅仅知道线程的基本概念是远远不够的, 你必须知道如何处理死锁,竞态条件,内存冲突和线程安全等并发问题。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。
1) 什么是线程?
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。
2) 线程和进程有什么区别?
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。
线程进程进一步区别参考这里:http://www.cnblogs.com/charlesblc/p/6135666.html
3) 如何在Java中实现线程?
继续看这一篇:
http://www.tuicool.com/articles/VRVFZb 《40个多线程问题总结》
【Todo】Java线程面试题 Top 50 (转载)的更多相关文章
- Java线程面试题 Top 50(转载)
原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末尾的 ...
- 【转载】 Java线程面试题 Top 50
Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...
- 【多线程】Java线程面试题 Top 50(转载)
Java线程面试题 Top 50 原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎 ...
- 【转载】Java线程面试题 Top 50
Java线程面试题 Top 50 2014/08/21 | 分类: 基础技术 | 4 条评论 | 标签: 多线程, 面试题 分享到:140 本文由 ImportNew - 李 广 翻译自 javare ...
- 18、Java线程面试题 Top 50
Java线程面试题 Top 50 原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎 ...
- Java 线程面试题 Top 50
--> Java 线程面试题 Top 50 html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1. ...
- Java线程面试题 Top 50 (转载)
转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html 本文由 ...
- Java线程面试题 Top 50【转载】
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...
- Java线程面试题 Top 50(转载)
原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited 不管你是新程序员还是老手,你一定在面试中遇 ...
- (转)Java线程面试题 Top 50
原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末 ...
随机推荐
- ElasticSearch可视化工具 Kibana
Kibana要和ElasticSearch 版本一致,默认的端口号是:5601
- Microsoft Project 2010基础使用方法
5.1 项目管理与Microsoft Project2010 Microsoft Project2010深受广大项目管理工程师的青睐. 5.1.1 项目管理的概念 项目管理是项目管理者在有限的资源约束 ...
- vue-gemini-scrollbar(vue组件-自定义滚动条)
vue-gemini-scrollbar(vue组件-自定义滚动条) https://segmentfault.com/a/1190000013338560
- protobuf的Compiler卸载
一.首先,只用remove命令是不起作用的. 二.找寻到进行make的文件夹目录,然后执行make uninstall命令. 三.通过which protoc 命令,找到protoc所在位置,rm p ...
- libcmt.lb libcmtd.lib与MSVCRTD.lib的冲突解决
system("pause"); 这个函数存在于MSVCRTD.lib库中: 当要使用system("pause")这个函数,且libcmt.lb libcmt ...
- PHP03 移动互联网和PHP
学习要点 移动互联网 云计算 网络通信协议 Apache http服务器 PHP运行原理 学习目标 理解网络通信协议 掌握PHP运行原理 WAMP开发环境的搭建 移动互联网 定义 移动互联网,就是 ...
- manjaro利用docker使用MySQL
使用docker安装MySQL并使用 安装docker: sudo yaourt -S docker 使用docker安装mysql: systemctl start docker # 启动docke ...
- fossil 使用
~$ fossil updateCannot figure out who you are! Consider using the --usercommand line option, setting ...
- linux 作为web应用服务器内核参数/etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux## For binary values, 0 is disabled, 1 is enable ...
- 【Mysql数据库】知识点总结
本文转载自:http://www.cnblogs.com/tonghun/p/7191131.html 一 数据库常用操作 mysql -u+username -p+password:登陆数据库管理系 ...