【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小组.转载请参见文章末 ...
随机推荐
- laravel扩展包服务提供者的注册的两种方式
一. 包自动发现 在 Laravel 应用的配置文件 config/app.php 中,providers 配置项定义了一个会被 Laravel 加载的服务提供者列表.当安装完新的扩展包后,在老版本中 ...
- QT+ 状态栏+核心控件+浮动窗口
#include "mainwindow.h" #include <QStatusBar> #include <QLabel> #include<QT ...
- SFM作业
代码:https://github.com/jianxiongxiao/SFMedu PPT:http://3dvision.princeton.edu/courses/SFMedu/slides.p ...
- 失误1: 把i放到循环体内部,i++失效
54 while($lines_num_of_whole_table>=1){ 55 my $i = 1; ...
- 【牛客练习赛 25】A 因数个数和
题目地址:https://www.nowcoder.com/acm/contest/158/A 参考博客:https://blog.csdn.net/zzcblogs/article/details/ ...
- linux shell 搭建本地yum 源,通过IOS镜像 Centeros6,7还有redhat
Centeros: 准备工作: 将系统镜像放到 /opt 下 脚本: #!/bin/bash mkdir /mnt/cdrom mount -o loop /opt/*.ios;# 此处改为你的系统镜 ...
- Django中的Cookie、Session、Token
Cookie : 指望着为了辨别用户身份.进行会话跟踪而存储在用户本地的数据(通常经过加密),是由服务端生成,发送给客户端浏览器,浏览器会将Cookie以key/value保存,下一请求同一网站是就发 ...
- python:端口扫描邮件推送
#!/usr/bin/env python import pickle import smtplib from email.mime.text import MIMEText import nmap ...
- JS模块之AMD, CMD, CommonJS、UMD和ES6模块
CommonJS 传送门 同步加载,适合服务器开发,node实现了commonJS.module.exports和require 判断commonJS环境的方式是(参考jquery源码): if ( ...
- POJ 1383 Labyrinth (树的直径求两点间最大距离)
Description The northern part of the Pyramid contains a very large and complicated labyrinth. The la ...