【面试官】ThreadLocal知道吧?

  • 面试官:Java线程的等待/通知机制知道吧?
  • 面试官:还有没有其他线程通信方式?
  • 面试官:你说的Lock对象说下你的理解?
  • 面试官:ThreadLocal知道吧?
  • 面试官:那线程生命周期都有什么?

大家好,我是南哥。

一个Java学习与进阶的领路人,跟着南哥我们一起Java成长。

文章目录

  1. 线程通信
    1. 线程的等待/通知机制
    2. 线程通信方式
    3. 更加灵活的ReentrantLock
  2. ThreadLocal作用
  3. 线程生命周期

1. 线程通信

1.1 线程的等待/通知机制

面试官:Java线程的等待/通知机制知道吧?

Java线程的等待/通知机制指的是:线程A获得了synchronized同步方法、同步方法块的锁资源后,调用了锁对象的wait()方法,释放锁的同时进入等待状态;而线程B获得锁资源后,再通过锁对象的notify()或notifyAll()方法来通知线程A恢复执行逻辑。

其实Java的所有对象都拥有等待/通知机制的本领,大家可以在JDK源码package java.lang`下找到Java.lang.Object里提供的五个与等待/通知机制相关的方法。

一、等待。

(1)使当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法。

    public final void wait() throws InterruptedException {
        wait(0);

(2)使当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或者指定的毫秒timeout过去。

    public final native void wait(long timeout) throws InterruptedException;

(3)使当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或者指定的毫秒timeout过去,另外nanos是额外时间,以纳秒为单位。

    public final void wait(long timeout, int nanos) throws InterruptedException {
    }

所以其实wait()、watit(0)、watit(0, 0)执行后都是同样的效果

二、通知。

(1)唤醒在此对象监视器上等待的单个线程。

    public final native void notify();

(2)唤醒在此对象监视器上等待的所有线程。

    public final native void notifyAll();

大家有没听说过消费者生产者问题呢?消费者生产者之间要无限循环生产和消费物品,解决之道就是两者形成完美的等待、通知机制。而这套机制就可以通过上文的wait、notify方法来实现。

1.2 线程通信方式

面试官:还有没有其他线程通信方式?

(1)利用Condition进行线程通信。

如果大家的程序直接采用的是Lock对象来同步,则没有了上文synchronized锁带来的隐式同步器,也就无法使用wait()、notify()方法。

此时的线程可以使用Condition对象来进行通信。例如下文的示例代码: condition0的await()阻塞当前线程,同时释放、等待获取锁资源;接着等待其他线程调用condition0的signal()来通知其获取锁资源继续执行。

@Slf4j
public class UseReentrantLock {

    private static final ReentrantLock lock = new ReentrantLock();

    private static final Condition condition0 = lock.newCondition();

    private static final Condition condition1 = lock.newCondition();

    public static void main(String[] args) {
        new Thread(() -> {
            try {
                lock.lock();

                for (int i = 1; i < 4; i++) {
                    log.info(i + "");

                    condition1.signal();
                    condition0.await();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }).s

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试突击 文章被收录于专栏

👉以面试官面试的形式,涵盖了你怒怼大厂面试官、拿下大厂面试所需掌握的核心知识、面试重点! 👉相信一定对你顺利通关面试、拿到理想Offer有所帮助! 👉花费大量精力去制作本专栏,创作不易,各位的支持就是我创作的最大动力!

全部评论
m
1 回复 分享
发布于 05-31 08:13 湖北
m
点赞 回复 分享
发布于 06-03 07:50 江苏

相关推荐

感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
周述安:这都能聊这么多。别人要是骂我,我就会说你怎么骂人?他要是继续骂我,我就把评论删了。
点赞 评论 收藏
分享
9 22 评论
分享
牛客网
牛客企业服务