「JUC个人笔记:多线程并发编程的企业级套路」

需积分: 0 0 下载量 58 浏览量 更新于2024-01-16 收藏 1.65MB PDF 举报
JUC个人笔记1 在多线程并发编程中,为了保证代码的高效运行和稳定性,需要遵循一些编程原则和套路。下面是一个企业级套路的模板,其中包括了一些重要的原则和注意事项。 1. 高内聚低耦合前提下,线程->操作->资源类 在多线程并发编程中,我们可以将整个程序划分为多个线程、操作和资源类。线程是一个独立的执行流,可以同时执行多个线程。操作是指具体的任务或操作,可以由线程执行。资源类是指被线程操作的共享资源或数据。 在编写多线程代码时,应该保持高内聚低耦合的原则。高内聚是指每个线程只负责一个明确的操作,使得代码逻辑简单清晰。低耦合是指线程之间的关联度较低,每个线程独立运行,不会相互影响。 2. 判断/干活/通知 在多线程交互中,通常会涉及到三个重要的步骤:判断、干活和通知。 判断是指线程在执行任务之前,需要判断是否满足执行条件。如果不满足条件,则线程进入等待状态,等待条件满足。干活是指线程执行实际的任务或操作。通知是指线程在执行完任务之后,通知其他线程继续执行。 在多线程交互中,这三个步骤应当按照一定的逻辑顺序执行,以保证线程之间的正确协同工作。 3. 多线程交互中必须要防止多线程的虚假唤醒 在多线程交互中,特别是使用wait、notify、await和signal方法时,必须要防止多线程的虚假唤醒。虚假唤醒是指线程在等待的过程中,没有收到notify或signal信号,却突然被唤醒。这种情况可能会导致程序逻辑错误或死锁。 为了防止虚假唤醒的发生,我们应当在判断等待条件时使用while循环,而不是使用if语句。while循环会在每次唤醒后再次判断条件,确保满足条件才能继续执行。 4. 标志位 标志位是在多线程并发操作中常用的一种技术手段。通过设置标志位,可以在多线程之间进行通信和控制。 在标志位的应用中,通常会有一个共享的标志位,用于表示某种状态或标识符。线程可以通过读取和修改标志位的值,实现线程间的通信和协作。 接下来是一个具体的例子,描述了三个同时出售30张票的问题,并使用了synchronized关键字来处理并发。在这个例子中,我们可以看到以上提到的一些编程原则和套路的应用。 1.1 synchronized版 在资源类Ticket中,定义了一个私有变量number表示剩余的票数。使用synchronized关键字修饰的saleTicket方法用于卖票。在方法内部,首先通过判断票数是否大于0来判断是否允许卖票,如果允许则进行卖票操作,将票数减1,并打印出当前票数。这样可以保证多个线程同时对资源类进行操作时的安全性。 在主程序中,创建了一个Ticket对象t,可供三个售票员同时操作。每个售票员都是一个独立的线程,通过调用t的saleTicket方法来卖票。在运行过程中,可以看到三个售票员相互竞争资源,但由于使用了synchronized关键字,每次只有一个线程能够执行。 总结: 多线程并发编程是一项复杂且重要的技术,使用正确的编程原则和套路可以保证代码的高效运行和稳定性。在编写多线程代码时,应该保持高内聚低耦合的原则,将程序划分为线程、操作和资源类,以便清晰地分工和协同工作。同时,在多线程交互中,需要注意判断、干活和通知的顺序,以及防止多线程的虚假唤醒。标志位是一种常用的线程间通信和控制手段,可以通过设置和读取标志位的值来实现线程间的同步和协作。最后,通过一个具体的例子,我们可以看到以上原则和套路的应用。