Java多线程并发编程问答-No2

16 阅读3分钟

一.什么是阻塞方法?

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

二.Java中的ReadWriteLock是什么?

读写锁是用来提升并发性能的锁分离技术的成果。

三.volatie变量和atomic变量有什么不同?

Volatile变量可以确保先行关系,即写操作会发生在后续的读操作之前,但它并不能保证原子性。例如用volatile修饰count变量那么count++操作就不是原子性的了。

而AtomicInteger类提供的atomic方法可以让这种操作具有原子性,如getAndIncrement()方法会原子性的进行增量操作把当前值加一,其他数据类型和引用变量也可以进行相似操作。

四.可以直接调用Thread类的run()方法吗?

当然可以。但是如果调用了Thread 的 run()方法,它的行为就会和普通的方法一样,会在当前线程中执行。

为了在新的线程中执行代码,必须使用Thread.start()方法。

五.如何让正在运行的线程暂停一段时间?

可以使用Thread类的Sleep()方法让线程暂停一段时间。需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态就会改变为Runnable,并且根据线程调度,它将得到执行。

六.如何理解线程的优先级?

每个线程都有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。

Java的线程优先级调度会委托给操作系统去处理,所以与具体的操作系统优先级有关,如非特别需要,一般无需设置线程优先级。

七.什么是线程调度器和时间分片?

线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。同上一个问题,线程调度并不受Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。

时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或线程等待时间。

八.如何确保main()方法所在的线程是Java程序最后结束的线程?

我们可以使用Thread类的join()方法来确保所有程序创建的线程在main()方法退出前结束。

九.线程之间是如何同心度?

当线程间是可以共享资源时,线程间通信是协调它们的重要手段。

Object类中wait(),notify(),notifyAll()方法可以用于线程间通信关于资源的锁的状态。

十.如何确保线程安全?

在Java中可以有很多方法来保证线程安全--同步,使用原子类(atomic concurrent classes),实现并发锁,使用volatile关键字,使用不变类和线程安全类。