Java并发——核心理论

简介: 并发编程是Java程序员最核心的技能之一,同时也是掌握难度最大的一部分。我们都知道Java中提供了各种异步机制,但无论是`notify` `wait`、`synchronized`、`volatile`亦或是`java.util.conccurrent`包下的`ReentrantLock`、`ThreadPoolExecutor`都遵循着相同的异步理论,要理解上述并发机制就必须首先了解Java异步的核心原理。

并发编程是Java程序员最核心的技能之一,同时也是掌握难度最大的一部分。我们都知道Java中提供了各种异步机制,但无论是notify waitsynchronizedvolatile亦或是java.util.conccurrent包下的ReentrantLockThreadPoolExecutor都遵循着相同的异步理论,要理解上述并发机制就必须首先了解Java异步的核心原理。

1 共享性

数据共享性是线程安全的主要原因之一。如果数据只在某一个线程中被访问则不存在共享性问题。然而在多线程环境下常常是多个线程共享一部分数据,为保证在多线程环境下共享数据的一致性,必须引入进程间的同步机制。

2 互斥性

资源互斥是指同时只允许一个访问者对其进行访问,具有唯一性和排它性。我们通常允许多个线程同时对数据进行读操作,但同一时间内只允许一个线程对数据进行写操作。所以我们通常将锁分为共享锁和排它锁,也叫做读锁和写锁。如果资源不具有互斥性,即使是共享资源,我们也不需要担心线程安全。例如,对于不可变的数据共享,所有线程都只能对其进行读操作,所以不用考虑线程安全问题。但是对共享数据的写操作,一般就需要保证互斥性。Java 中提供多种机制来保证互斥性,最简单的方式是使用Synchronized。

3 原子性

所谓原子性指的是一系列不可分割的,独立的操作,换句话说就是如果执行一个原子性操作,要么不执行,要么执行完该原子性操作,不会出现只做一半的情况。最底层的原子性操作是操作系统的指令。但Java层面的操作往往是由多个原子性操作构成的,要保证Java操作的原子性最常见的方式就是加锁,如Java中的Synchronized或Lock都可以实现,代码段二就是通过Synchronized实现的。除此之外还有一种方式是CAS(Compare And Swap):即修改数据之前先比较与之前读取到的值是否一致,如果一致,则进行修改,如果不一致则重新执行,这也是乐观锁的实现原理。

4 可见性

这里写图片描述

在多线程环境下,每一个线程都维护一个本地的工作内存,线程操作一个共享变量时并不是直接操作在主内存中的变量,而是将其先拷贝到自己工作内存后再就行修改,同时在修改完成后再同步到主内存。而所谓可见性就是当某一个线程改变某一共享变量后,另一线程可以感知到这一变化。Java中通过Synchronizedvolatile来保证可见性。

5 有序性

学过体系结构的朋友都知道,为了提高程序运行的效率,CPU会对指令进行重排序,以实现指令级并行。其实在现代操作系统中,除了指令级重排序外,编译器和内存系统也会进行相应的重排序以提升效率。

在单线程环境下,以上的重排序是不会改变程序的运行逻辑的。但是到了多线程环境,这样的重排序则可能导致逻辑错乱。Java中通过Synchronizedvolatile来保证顺序性。

相关文章
|
1月前
|
存储 安全 算法
解读 Java 并发队列 BlockingQueue
解读 Java 并发队列 BlockingQueue
20 0
|
5天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
7天前
|
Java 开发者
Java中多线程并发控制的实现与优化
【4月更文挑战第17天】 在现代软件开发中,多线程编程已成为提升应用性能和响应能力的关键手段。特别是在Java语言中,由于其平台无关性和强大的运行时环境,多线程技术的应用尤为广泛。本文将深入探讨Java多线程的并发控制机制,包括基本的同步方法、死锁问题以及高级并发工具如java.util.concurrent包的使用。通过分析多线程环境下的竞态条件、资源争夺和线程协调问题,我们提出了一系列实现和优化策略,旨在帮助开发者构建更加健壮、高效的多线程应用。
7 0
|
8天前
|
存储 缓存 安全
Java并发基础之互斥同步、非阻塞同步、指令重排与volatile
在Java中,多线程编程常常涉及到共享数据的访问,这时候就需要考虑线程安全问题。Java提供了多种机制来实现线程安全,其中包括互斥同步(Mutex Synchronization)、非阻塞同步(Non-blocking Synchronization)、以及volatile关键字等。 互斥同步(Mutex Synchronization) 互斥同步是一种基本的同步手段,它要求在任何时刻,只有一个线程可以执行某个方法或某个代码块,其他线程必须等待。Java中的synchronized关键字就是实现互斥同步的常用手段。当一个线程进入一个synchronized方法或代码块时,它需要先获得锁,如果
24 0
|
16天前
|
存储 缓存 安全
【企业级理解】高效并发之Java内存模型
【企业级理解】高效并发之Java内存模型
|
23天前
|
安全 Java
Java中的多线程并发控制
在Java中,多线程是实现并发执行任务的一种重要方式。然而,随着多个线程同时访问共享资源,可能会导致数据不一致和其他并发问题。因此,了解并掌握Java中的多线程并发控制机制显得尤为重要。本文将深入探讨Java的多线程并发控制,包括synchronized关键字、Lock接口、Semaphore类以及CountDownLatch类等,并通过实例代码演示其使用方法和注意事项。
12 2
|
27天前
|
缓存 NoSQL Java
Java项目:支持并发的秒杀项目(基于Redis)
Java项目:支持并发的秒杀项目(基于Redis)
26 0
|
29天前
|
算法 安全 Java
Java中的并发编程:理解并发性能优化
在当今软件开发领域,多核处理器的普及使得并发编程变得更加重要。本文将深入探讨Java中的并发编程,介绍并发性能优化的关键技术,帮助开发人员更好地利用多核处理器提升应用程序性能。
|
1月前
|
安全 Java API
Java并发 - J.U.C并发容器类 list、set、queue
Queue API 阻塞是通过 condition 来实现的,可参考 Java 并发 - Lock 接口 ArrayBlockingQueue 阻塞 LinkedBlockingQueue 阻塞 ArrayQueue 非阻塞 LinkedQueue 非阻塞
|
1月前
|
安全 Java 调度
[Java并发基础] 共享内存
[Java并发基础] 共享内存
30 0