44、如何在两个线程间共享数据?
在两个线程间共享变量即可实现共享。 一般来说, 共享变量要求变量本身是线程安全的, 然后在线程内使用的时候, 如果有 对共享变量的复合操作, 那么也得保证复合操作的线程安全性。
45、Java 中 notify 和 notifyAll 有什么区别?
notify() 方法不能唤醒某个具体的线程, 所以只有一个线程在等待的时候它才有用武之 地。而 notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行。
46、为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面?
一个很明显的原因是 JAVA 提供的锁是对象级的而不是线程级的, 每个对象都有锁,通过 线程获得。由于 wait,notify 和 notifyAll 都是锁级别的操作,所以把他们定义在 Object 类中因为锁属于对象。
47、什么是 ThreadLocal 变量?
ThreadLocal 是 Java 里一种特殊的变量。每个线程都有一个 ThreadLocal 就是每个线程 都拥有了自己独立的一个变量, 竞争条件被彻底消除了。它是为创建代价高昂的对象获取 线程安全的好方法, 比如你可以用 ThreadLocal 让 SimpleDateFormat 变成线程安全的, 因为那个类创建代价高昂且每次调用都需要创建 不同的实例所以不值得在局部范围使用它, 如果为每个线程提供一个自己独有的变量拷贝, 将大大提高效率。首先, 通过复用减少了代价高昂的对象的创建个数。 其次, 你在没有使用高代价的同步或者不变性的情况下获得了线程安全。
48、Java 中 interrupted 和 isInterrupted 方法的区别?
interrupt interrupt 方法用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。注意: 线程中断仅仅是置线程的中断状态位, 不会停止线程。需要用户自己去监视线程的状态为 并做处理。支持线程中断的方法( 也就是线程中断后会抛出 interruptedException 的方法) 就是在监视线程的中断状态, 一旦线程的中断状态被置 为“ 中断状态” , 就会抛出中断异常。 interrupted 查询当前线程的中断状态, 并且清除原状态。如果一个线程被中断了, 第一次调用 interrupted 则返回 true, 第二次和后面的就返回 false 了。 isInterrupted 仅仅是查询当前线程的中断状态
49、为什么 wait 和notify 方法要在同步块中调用?
Java API 强制要求这样做, 如果你不这么做, 你的代码会抛出 IllegalMonitorStateException 异常。还有一个原因是为了避免 wait 和 notify 之间产 生竞态条件。
50、为什么你应该在循环中检查等待条件?
处于等待状态的线程可能会收到错误警报和伪唤醒, 如果不在循环中检查等待条件, 程序 就会在没有满足结束条件的情况下退出。