面试之 Java 并发编程(六)

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、为什么你应该在循环中检查等待条件?

处于等待状态的线程可能会收到错误警报和伪唤醒, 如果不在循环中检查等待条件, 程序 就会在没有满足结束条件的情况下退出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值