线程安全的定义:
<<Java Concurrency In Practice>>的作者Brian Goetz 对"线程安全"有一段定义: 当多个线程访问一个对象的时候, 如果不用考虑这些线程在运行时环境下的调度和交替执行, 也不需要惊醒额外的同步,或者在调用方惊醒任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象就是线程安全的.
我们把java中各种操作共享的数据分成一下5类:
不可变, 绝对线程安全, 相对线程安全, 线程兼容, 线程对立.
线程安全的实现方法:
(1) 互斥同步:
互斥是因, 同步是果,推荐使用 synchronized 关键字进行同步, 在 concurrent包中有ReentrantLock类, 实现效果差不多. 还是推荐原生态的synchronized.
(2) 非阻塞同步:
需要硬件指令完成.常用的指令有:
Test-and-Set
Fetch-and-Increment
Swap
Compare-and-Swap (CAS)
Load-Linked/Store-Conditional (LL/SC)
典型的应用在 AtomicInteger 中
(3) 无同步方案
可重入代码: 在代码执行的任何时刻中断它, 转而去执行另外一段代码,而在控制权返回后,原来的程序不会出现任何错误.
可重入代码有一些共同的特性: 例如不以来存储在堆上的数据和公用的系统资源,用到的状态量都由参数中传入,不调用非可重入的方法等.
线程本地存储: 如果一段代码中所需要的数据必须与其他代码共享,那就看看这些共享数据的代码是否能保证在统一线程中执行?如果能保证,可以把共享数据的可见范围限制在同一个线程中,这样,无需同步也能保证线程之间不出现数据争用问题. 在java中可以通过使用 java.lang.ThreadLocal 开实现线程本地存储的功能.
这种应用在人人网的开源框架 Rose 有广泛的应用,最经典的应用在获取当前登录用户对象的时候, 是通过t票 到cache中来拿到当前登录用户的user对象. 对象就保存在 ThreadLocal 中. 经典的web交互模型中"一个请求对应一个服务器线程"的处理方式, 把user对象保存在线程本地存储中 可以很好的解决线程安全的问题.
分享到:
相关推荐
Java线程安全是多线程编程中的一个关键概念,它涉及到多个线程访问共享资源时可能出现的问题。在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的...
Java线程安全是多线程编程中的一个关键概念,它涉及到在并发环境下如何正确地管理共享资源,确保程序的正确性和一致性。以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一...
- `ConcurrentLinkedQueue`:无界的线程安全队列,基于链接节点实现,适合高并发场景。 - `LinkedBlockingQueue`:有界线程安全队列,适合生产者-消费者模型。 3. 不可变集合(Immutable Collections): 例如`...
它展示了如何与非线程安全的类共同工作,并特别关注于Swing的线程问题。新增加的一章介绍了如何为多处理器机器编写并行代码。 简而言之,本书的新版涉及了有关线程的方方面面,从最简单的动画applet到最复杂的应用...
这篇博客文章将探讨如何在Java中实现这样一个线程安全的循环单链表,并通过源码分析来加深理解。 首先,我们需要定义一个表示链表节点的类`Node`,它包含两个属性:`value`存储节点的值,`next`指向下一个节点。...
本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...
Java线程是多线程编程的核心概念,是Java语言中实现并发执行的机制。线程安全和同步线程是确保在多线程环境下正确执行的关键因素。线程安全指的是一个方法或类在多线程环境下可以正确无误地运行,不会因为线程之间的...
本文将深入探讨两种传统的Java线程实现方式,并通过一个具体的例子来阐述如何创建和管理这些线程。 首先,我们来看第一种线程实现方式:继承`Thread`类。当你创建一个新的类继承自`java.lang.Thread`,你可以重写它...
Java提供了多种机制来保证线程安全,比如使用synchronized关键字来同步方法或代码块,实现线程之间的同步。当一个线程试图进入一个已经被另一个线程持有的同步代码块时,它将进入阻塞状态,直到同步代码块的执行线程...
4. **原子类(Atomic Variables)**:如`AtomicInteger`,它们提供了一种无锁的线程安全实现,适用于简单的原子操作。 ```java import java.util.concurrent.atomic.AtomicInteger; public class Counter { ...
总之,Java线程是并发编程的基础,理解和掌握线程的生命周期、实现方式和同步机制对于编写高效、安全的多线程程序至关重要。在实际应用中,根据需求选择合适的线程实现策略,并结合同步机制,可以有效地利用系统资源...
java内存模型和线程安全,详细解析java的 堆栈模型和线程机制
本文将详细介绍如何在Java中创建线程安全的Singleton,包括几种常见的实现方式和最佳实践。 在Java中创建线程安全的Singleton模式是一项重要的任务,尤其是在多线程环境中。通过使用饿汉式、懒汉式与双重检查锁定、...
基于Java多线程与线程安全实践-基于Http协议的断点续传设计与实现.zip基于Java多线程与线程安全实践-基于Http协议的断点续传设计与实现.zip基于Java多线程与线程安全实践-基于Http协议的断点续传设计与实现.zip基于...
下面我们将详细讨论如何使用Java线程来实现这一功能。 首先,我们需要理解线程的基本概念。线程是程序执行的最小单元,一个进程可以包含多个线程,每个线程都有自己的程序计数器、寄存器和栈空间,但共享同一块内存...
### JAVA线程安全及性能优化的关键知识点 #### 一、JAVA内存模型与线程安全的基础概念 **JAVA内存模型**是理解线程安全的核心。不同的操作系统平台可能有不同的内存管理方式,但Java虚拟机(JVM)提供了一套统一的...
最后,线程安全的数据结构和并发容器,如`Atomic`类、`CopyOnWriteArrayList`和`ConcurrentLinkedQueue`,它们提供了一种线程安全的方式来操作共享数据,避免了同步带来的开销。 总之,《Java线程(第三版)》全面...
Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...
在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源利用率的有效方法。多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多...
Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...