urlname
type
Post
password
SyncToConfluence
category
学习笔记
date
Apr 20, 2024
slug
01HVXFGD67XGWWJSR5J1C4VS60
icon
Button
catalog
summary
tags
Java
JUC
多线程
cover
Status
BusyTime
Status 1
status
Published

简介

Java中多线程编程的基础

  • 在Java中,Thread类及实现Runnable接口是创建新线程的基础方式。
  • Java的线程是由JVM管理的线程,能够运行在任何操作系统上,JVM对线程的管理屏蔽了底层操作系统的差异,使得Java程序可以透明地在多种操作系统上运行。
  • Java还提供了关键字synchronizedvolatile,以及java.util.concurrent包中的高级并发功能,如锁、线程池等,来实现线程间的并发和通信。

什么是线程安全?

指当多个线程访问某个类的实例时,不管运行时环境采用何种调度方式或者线程如何交替执行,这个类始终能表现出正确的行为。

为什么需要线程安全?

  • 在多线程环境中,如果没有妥善地管理对共享资源的访问,就可能导致数据不一致、应用程序状态不可预测等问题。
  • 例如,若两个线程同时修改同一数据,可能导致最终结果依赖于线程执行的具体顺序。

线程安全的常见问题

竞态条件(Race Conditions)

  • 描述:
    • 当多个线程同时访问和修改同一个对象或资源,而最终的结果又依赖于线程的执行顺序时,就会发生竞态条件。
  • 例子:
    • 假设有一个简单的银行账户类,允许存款和取款操作。如果两个线程同时对同一个账户进行操作,而没有适当的同步措施,就可能出现竞态条件。

死锁(Deadlocks)

  • 描述:
    • 死锁发生在两个或更多的线程永久性地阻塞对方,因为每个线程都持有另一个线程需要的资源,并等待其他线程释放资源。这种情况下,涉及的线程无法继续执行。
  • 例子:
    • 考虑两个线程和两个资源(如两把锁),如果每个线程分别持有一个资源并等待另一个资源释放,就会导致死锁。

活锁(Livelocks)

  • 描述:
    • 活锁是指线程不断重复执行相同的操作,但这些操作都无法推进程序状态。通常发生在两个线程尝试避免彼此死锁时,不断改变自己的状态以响应对方的状态。
  • 例子:
    • 例如两个人试图通过一扇门,每个人都礼貌地让对方先过,结果就是他们俩都在门口徘徊,没人能通过。

饥饿(Starvation)

  • 描述:
    • 饥饿发生在一个或多个线程无法获得它们需要的资源,因此无法进行进一步处理。通常是因为其他“贪婪”的线程持续占用这些资源,导致某些线程长时间得不到调度。
  • 例子:
    • 高优先级的线程持续占用共享资源,导致一个或多个低优先级线程长时间等待,无法执行。
Java多线程——锁Android APK打包流程
Loading...