11 多线程与锁

11 多线程与锁

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

本文介绍Java多线程与锁。创建线程可继承Thread或实现Runnable;常用API包括start、sleep、join、interrupt、setDaemon。ReentrantLock通过lock与unlock保证计数安全。synchronized是锁的语法糖,可修饰代码块或方法。wait与notify用于线程等待和唤醒。

🔎

延伸解读

两种创建线程方式的区别

文章介绍了继承Thread和实现Runnable两种方式。继承Thread后,每个线程对象独立,但Java单继承限制可能影响扩展;实现Runnable更灵活,多个线程可共享同一个Runnable实例,适合资源共用的场景。选择时需考虑代码结构和复用需求。

ReentrantLock与synchronized的对比

ReentrantLock需手动lock和unlock,且unlock必须放在finally中确保释放,否则可能死锁。synchronized是语法糖,自动加锁释放,更简洁。文章示例中,ReentrantLock用于计数安全,而synchronized可修饰代码块或方法,后者锁的是this对象。

wait与notify的使用要点

wait和notify必须在synchronized块内调用,否则会抛出异常。wait会释放锁并等待,notify/notifyAll唤醒等待线程。文章示例中,多个线程等待,一个线程唤醒所有,展示了线程间协作的基本模式。注意notifyAll唤醒所有等待线程,而notify只唤醒一个。

❓

Q&A

Java中创建多线程有哪两种方式?

有两种方式:一是继承Thread类并重写run方法;二是实现Runnable接口,并将实现类的实例传给Thread构造函数。

Thread类的常用API有哪些?

常用API包括:start()启动线程,sleep()使线程休眠,join()等待线程结束,interrupt()中断休眠中的线程,setDaemon()设置守护线程(当仅剩守护线程时程序自动退出)。

ReentrantLock如何保证线程安全?

通过lock()获取锁,如果锁已被其他线程持有则阻塞;操作完成后在finally块中调用unlock()释放锁并唤醒其他阻塞线程,从而保证共享资源的安全访问。

synchronized关键字可以怎么用?

synchronized是锁的语法糖,可以修饰代码块(指定锁对象)或修饰方法(锁定当前对象this)。

wait和notify方法的作用是什么?

wait()使当前线程等待并释放锁,notify()或notifyAll()唤醒等待中的线程。它们必须在synchronized块中调用。

守护线程有什么特点?

守护线程通过setDaemon()设置,当程序中只剩下守护线程时,程序会自动退出。

🏷️

标签

➡️

继续阅读