`
sharp-fcc
  • 浏览: 110839 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 线程安全的实现方式

阅读更多

线程安全的定义:

<<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中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的...

    java线程安全总结.doc

    Java线程安全是多线程编程中的一个关键概念,它涉及到在并发环境下如何正确地管理共享资源,确保程序的正确性和一致性。以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一...

    Java多线程安全集合

    - `ConcurrentLinkedQueue`:无界的线程安全队列,基于链接节点实现,适合高并发场景。 - `LinkedBlockingQueue`:有界线程安全队列,适合生产者-消费者模型。 3. 不可变集合(Immutable Collections): 例如`...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    它展示了如何与非线程安全的类共同工作,并特别关注于Swing的线程问题。新增加的一章介绍了如何为多处理器机器编写并行代码。 简而言之,本书的新版涉及了有关线程的方方面面,从最简单的动画applet到最复杂的应用...

    JAVA实现一个线程安全的循环单链表

    这篇博客文章将探讨如何在Java中实现这样一个线程安全的循环单链表,并通过源码分析来加深理解。 首先,我们需要定义一个表示链表节点的类`Node`,它包含两个属性:`value`存储节点的值,`next`指向下一个节点。...

    java多线程实现大批量数据导入源码

    本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...

    java线程线程安全同步线程

    Java线程是多线程编程的核心概念,是Java语言中实现并发执行的机制。线程安全和同步线程是确保在多线程环境下正确执行的关键因素。线程安全指的是一个方法或类在多线程环境下可以正确无误地运行,不会因为线程之间的...

    java线程:两种传统的实现方式.zip

    本文将深入探讨两种传统的Java线程实现方式,并通过一个具体的例子来阐述如何创建和管理这些线程。 首先,我们来看第一种线程实现方式:继承`Thread`类。当你创建一个新的类继承自`java.lang.Thread`,你可以重写它...

    Java多线程知识点总结

    Java提供了多种机制来保证线程安全,比如使用synchronized关键字来同步方法或代码块,实现线程之间的同步。当一个线程试图进入一个已经被另一个线程持有的同步代码块时,它将进入阻塞状态,直到同步代码块的执行线程...

    Java多线程 - (一) 最简单的线程安全问题

    4. **原子类(Atomic Variables)**:如`AtomicInteger`,它们提供了一种无锁的线程安全实现,适用于简单的原子操作。 ```java import java.util.concurrent.atomic.AtomicInteger; public class Counter { ...

    Java线程详解大全

    总之,Java线程是并发编程的基础,理解和掌握线程的生命周期、实现方式和同步机制对于编写高效、安全的多线程程序至关重要。在实际应用中,根据需求选择合适的线程实现策略,并结合同步机制,可以有效地利用系统资源...

    java内存模型和线程安全

    java内存模型和线程安全,详细解析java的 堆栈模型和线程机制

    Java线程安全的Singleton模式:深入分析与实现

    本文将详细介绍如何在Java中创建线程安全的Singleton,包括几种常见的实现方式和最佳实践。 在Java中创建线程安全的Singleton模式是一项重要的任务,尤其是在多线程环境中。通过使用饿汉式、懒汉式与双重检查锁定、...

    基于Java多线程与线程安全实践-基于Http协议的断点续传设计与实现.zip

    基于Java多线程与线程安全实践-基于Http协议的断点续传设计与实现.zip基于Java多线程与线程安全实践-基于Http协议的断点续传设计与实现.zip基于Java多线程与线程安全实践-基于Http协议的断点续传设计与实现.zip基于...

    JAVA 线程实现数据库的主从同步更新

    下面我们将详细讨论如何使用Java线程来实现这一功能。 首先,我们需要理解线程的基本概念。线程是程序执行的最小单元,一个进程可以包含多个线程,每个线程都有自己的程序计数器、寄存器和栈空间,但共享同一块内存...

    JAVA线程安全及性能的优化.doc

    ### JAVA线程安全及性能优化的关键知识点 #### 一、JAVA内存模型与线程安全的基础概念 **JAVA内存模型**是理解线程安全的核心。不同的操作系统平台可能有不同的内存管理方式,但Java虚拟机(JVM)提供了一套统一的...

    Java线程(第三版)

    最后,线程安全的数据结构和并发容器,如`Atomic`类、`CopyOnWriteArrayList`和`ConcurrentLinkedQueue`,它们提供了一种线程安全的方式来操作共享数据,避免了同步带来的开销。 总之,《Java线程(第三版)》全面...

    java线程安全以及生产者消费者demo

    Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源利用率的有效方法。多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多...

    java线程实例 各种小Demo

    Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...

Global site tag (gtag.js) - Google Analytics