java多线程面试题

发布时间:2024-05-19 点击:95
121,什么是线程?
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。
(更多相关面试题推荐:java面试题及答案)
122,线程和进程有什么区别?
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。每个线程都拥有单独的栈内存用来存储本地数据。
123,如何在java中实现线程?
两种方式:java.lang.thread 类的实例就是一个线程但是它需要调用java.lang.runnable接口来执行,由于线程类本身就是调用的runnable接口所以你可以继承java.lang.thread 类或者直接调用runnable接口来重写run()方法实现线程。
124,java 关键字volatile 与 synchronized 作用与区别?
1,volatile
它所修饰的变量不保留拷贝,直接访问主内存中的。
在java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变 量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。 一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程memory中。
2,synchronized
当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用.
125,有哪些不同的线程生命周期?
当我们在java程序中新建一个线程时,它的状态是new。当我们调用线程的start()方法时,状态被改变为runnable。线程调度器会为runnable线程池中的线程分配cpu时间并且讲它们的状态改变为running。其他的线程状态还有waiting,blocked 和dead。
126,你对线程优先级的理解是什么?
每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(os dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。
127,什么是死锁(deadlock)?如何分析和避免死锁?
死锁是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程和两个以上的资源。
分析死锁,我们需要查看java应用程序的线程转储。我们需要找出那些状态为blocked的线程和他们等待的资源。每个资源都有一个唯一的id,用这个id我们可以找出哪些线程已经拥有了它的对象锁。
避免嵌套锁,只在需要的地方使用锁和避免无限期等待是避免死锁的通常办法。
128,什么是线程安全?vector是一个线程安全类吗?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。vector 是用同步方法来实现线程安全的, 而和它相似的arraylist不是线程安全的。
(相关视频教程推荐:java课程)
129,java中如何停止一个线程?
java提供了很丰富的api但没有为停止线程提供api。jdk 1.0本来有一些像stop(), suspend() 和 resume()的控制方法但是由于潜在的死锁威胁因此在后续的jdk版本中他们被弃用了,之后java api的设计者就没有提供一个兼容且线程安全的方法来停止一个线程。当run() 或者 call() 方法执行完的时候线程会自动结束,如果要手动结束一个线程,你可以用volatile 布尔变量来退出run()方法的循环或者是取消任务来中断线程
130,什么是threadlocal?
threadlocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选择threadlocal变量。
每个线程都会拥有他们自己的thread变量,它们可以使用get()\\\\set()方法去获取他们的默认值或者在线程内部改变他们的值。threadlocal实例通常是希望它们同线程状态关联起来是private static属性。
131,sleep()、suspend()和wait()之间有什么区别?
thread.sleep()使当前线程在指定的时间处于“非运行”(not runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块或方法中。如果另一线程调用了interrupt()方法,它将唤醒那个“睡眠的”线程。
注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep(),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。
object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是object的方法而不是thread。调用object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用object.notify(),这样将唤醒原来等待中的线程,然后释放该锁。基本上wait()/notify()与sleep()/interrupt()类似,只是前者需要获取对象锁。
132,什么是线程饿死,什么是活锁?
当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资源可用。javaapi中线程活锁可能发生在以下情形:
1,当所有线程在程序中执行object.wait(0),参数为0的wait方法。程序将发生活锁直到在相应的对象上有线程调用object.notify()或者object.notifyall()。
2,当所有线程卡在无限循环中。
133,什么是java timer类?如何创建一个有特定时间间隔的任务?
java.util.timer是一个工具类,可以用于安排一个线程在未来的某个特定时间执行。timer类可以用安排一次性任务或者周期任务。
java.util.timertask是一个实现了runnable接口的抽象类,我们需要去继承这个类来创建我们自己的定时任务并使用timer去安排它的执行。
134,java中的同步集合与并发集合有什么区别?
同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。
在java1.5之前程序员们只有同步集合来用且在多线程并发的时候会导致争用,阻碍了系统的扩展性。
java5介绍了并发集合像concurrenthashmap,不仅提供线程安

如何建设一个网站?建设一个网站有什么优势?
epic商店注册不了账号提示响应错误怎么修复
原账号归属哈尔滨米米米业科技有限公司现变更为哈尔滨工程北米科
云服务器到期后续期多少钱
域名已经被注册了怎么办
国内申请域名在哪个网站?申请域名的流程包括什么?
建网站要准备什么?建设一个网站哪家好?
.cc后缀的域名是哪里的域名?.CC域名有哪些特点?