`

Java的多线程编程模型2--怎样才线程安全

阅读更多

在Java多线程编程模型1里面讲到了为什么线程不安全,那怎样才能做到线程安全了?

先来看线程工作是跟内存是怎么打交道的。

在并发的线程中,分为主内存和工作内存,主内存就是程序分配的内存,工作内存就是线程所占的内存。线程可能在工作内存中存储了某些主内存对象的副本。当线程操作某个主内存的对象时,先从主内存中将变量的值拷贝到工作内存中,然后在工作内存中改变这个值,最后将这个值刷到主内存中。

在<<java concurrency in pratise>>中提出了线程安全的思路

1) 不要在线程间共享变量

2) 如果不行,就要final变量

3) 还是不行,就用volatile或其它并发控制。

其实基本的思路是尽量减少共享变量,如果实在要用,则需要并发控制。

那非要用的时候怎么办了,这个时候就需要拿出happens-before规则来检查多线程的程序了。

(1)同一个线程中的每个Action都happens-before于出现在其后的任何一个Action(Program order rule)
(2)对一个监视器的解锁happens-before于每一个后续对同一个监视器的加锁(Monitor lock rule)
(3)对volatile字段的写入操作happens-before于每一个后续的同一个字段的读(Volatile variable rule.)
(4)Thread.start()的调用会happens-before于启动线程里面的动作(Thread start rule.)
(5)Thread中的所有动作都happens-before于其他线程检查到此线程结束或者Thread.join()中返回或者Thread.isAlive()==false(Thread termination rule.)
(6)一个线程A调用另一个线程B的interrupt()都happens-before于线程A发现B被A中断(B抛出异常或者A检测到B的isInterrupted()或者interrupted())(Interruption rule)
(7)一个对象构造函数的结束happens-before于该对象的finalizer的开始(Finalizer rule.)
(8)如果A动作happens-before于B动作,而B动作happens-before与C动作,那么A动作happens-before于C动作(Transitivity)

如果你的程序能够满足上面的发则,那么恭喜你,不会在出现并发的问题了。

分享到:
评论

相关推荐

    Java多线程编程实战指南-核心篇

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

    Java多线程编程总结

    Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    Java多线程编程经验

    ### Java多线程编程经验 #### 一、Java线程:概念与原理 现代操作系统都是多任务操作系统,其中多线程是一种重要的实现多任务的方式。线程是进程内的一个执行单位,一个进程可以包含多个线程。例如,在Java应用...

    多线程编程实战指南-核心篇

    总之,《多线程编程实战指南-核心篇》是一本全面解析Java多线程编程的书籍,通过学习,开发者不仅可以掌握多线程编程的基本原理,还能学会如何在实际项目中应用这些知识,提升程序的并发性能和稳定性。对于有一定...

    java多线程编程-详细炒作例子

    ### Java多线程编程详解与实战案例 #### 理解多线程概念与Java内存模型 多线程,作为现代编程中的一项关键技术,允许在单一应用程序中并发执行多个指令流,每个这样的指令流被称为一个线程。在Java中,线程被视为...

    java 多线程编程指南

    这份“Java多线程编程指南”深入探讨了这一主题,为中级到高级的Java开发者提供了宝贵的资源。 首先,多线程的基础概念是理解整个主题的关键。线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机栈、...

    java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在本教程中,我们将深入探讨Java中的多线程设计模式、并发核心编程概念以及线程池的工作原理和种类。 首先,让我们了解什么...

    JAVA多线程编程详解-详细操作例子(转自CSDN)

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升程序的效率和响应性。本文将详细解析Java中实现多线程的两种主要方式,并讨论线程的基本概念和内存模型。 首先,理解多线程的概念至关...

    深入学习:Java多线程编程

    《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...

    Java-jdk10-最新最全多线程编程实战指南-核心篇

    《Java-jdk10-最新最全多线程编程实战指南-核心篇》是一本深入探讨Java多线程编程的专著,针对Java 10版本进行了全面的更新和优化。这本书聚焦于Java多线程的核心概念和技术,旨在帮助开发者理解和掌握如何在并发...

    2022年Java多线程编程精要之基础Java教程.docx

    Java 多线程编程基础知识 Java 多线程编程精要之基础 Java 教程是 Java 程序中运用多线程的基本教程,旨在...Java 多线程编程的优点包括简洁的编程模型、高效的计算资源利用率、简单的线程间通讯和等待问题的解决。

    java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的...

    Java多线程编程

    ### Java多线程编程知识点详解 #### 一、线程基础概述 - **定义与特点:** - **线程**是一种比进程更细粒度的执行单元,它允许在一个进程中并发执行多个任务。 - **轻量级进程**:线程有时被称为轻量级进程,...

    JAVA多线程编程详解-详细操作例子

    ### JAVA多线程编程详解-详细操作例子 #### 一、理解多线程 多线程是一种编程模型,它允许程序中的多个指令流同时运行,每个指令流即为一个线程,它们彼此独立但共享同一进程资源。这种机制极大地提高了程序的并发...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

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

    线程安全是多线程编程中的一个重要概念,指的是在多线程环境下,一个类或者对象的行为不会因为线程的并发访问而导致不正确的结果。在Java中,我们通常通过以下几种方式来保证线程安全: 1. **同步机制**:包括`...

    JAVA多线程模型详解

    在多线程编程领域,Java作为一门广泛使用的编程语言,其内置的多线程模型一直是学习和应用的重点。本文将深入探讨Java多线程模型的相关知识点,包括线程与进程的区别、线程的实现原理、线程的创建方法以及线程的阻塞...

Global site tag (gtag.js) - Google Analytics