原标题:Java多线程面试题分享
在分享面试题之前,先回顾一下进程和线程的相关定义,有时候这也是面试时的题目:
1、进程是什么?
进程是程序在处理机中的一次运行。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立。所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销。
2、线程是什么?
线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。所以线程是轻量级的任务,它们之间的通信和转换只需要较小的系统开销。
还有哪些常问的面试题呢?
1、并行和并发有什么区别?
答:两者区别:一个是交替执行,一个是同时执行。
2、创建线程有哪几种方式?
答:继承Thread类、实现Runnable接口和实现Callable接口。
3、线程有哪些状态?
答:线程可以正在运行(Running),只要获得了CPU时间它就可以运行;
运行的线程可以被挂起(Suspend),并临时中断它的执行;
一个挂起的线程可以被恢复(Resume),允许它从停止的地方继续运行;
一个线程可以在等待资源时被阻塞(Block);
在任何时候,线程可以被终止(Terminate),这将立即中断运行。一旦终止,线程不能被恢复。
有的说六种的是算上初始的状态,即:初始(New):新创建了一个线程对象,但还没有调用start()方法。
4、sleep() 和 wait() 有什么区别?
答:(1)同步锁的对待不同:
sleep()后,程序并不会不释放同步锁。
wait()后,程序会释放同步锁。
(2)用法的不同:
sleep()可以用时间指定来使他自动醒过来。如果时间不到你只能调用interreput()来强行打断。
wait()可以用notify()直接唤起。
(3)属于不同的类:
sleep()的类是Thread。
wait()的类是Object。
5、线程的 run()和 start()有什么区别?
答:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
6、什么是死锁?怎么防止死锁?
答:当某一进程提出资源的使用要求后,使得系统中一些进程处于无休止的阻塞状态,在无外力的作用下,这些进程永远也不能继续前进。我们称这种现象为死锁。
(1) 尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。
(2)尽量使用 Java. util. concurrent 并发类代替自己手写锁。
(3)尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。
(4)尽量减少同步的代码块。
7、synchronized 和 ReentrantLock 区别是什么?
答:一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。
ReentrantLock更加灵活,提供了超时获取锁,可中断锁。提供了非公平锁和非公平锁,而synchronized仅仅是非公平锁。
用法上,ReentrantLock必须手动释放锁,并且只能修饰代码块。而synchronized不用手动释放锁,除此之外可以修饰方法。
使用synchronized的线程会被block住,而ReentrantLock的线程则是进入waiting状态。返回搜狐,查看更多
责任编辑: