1.什么是线程安全性
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者现线程将如何交替执行,并且在主调代
码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的。
在线程安全的类中封装了必要的同步机制,因此调用者无需进一步采取同步措施。
无状态对象一定是线程安全的。
2.竞态条件
在并发编程时,由于不恰当的执行时序而出现不正确的结果。
比如,先检查后执行。
3.加锁机制
要保持状态的一致性,就需要在单个原子操作中更新所有的状态变量。
3.1内置锁
Java提供了一种内置的锁机制来支持原子性,即同步代码块,使用synchronized修饰,synchronized修饰方法,则整个方法是一个同步代码块。
同步代码块:
synchronized (lock){ // 访问或修改由锁保护的共享状态 }
同步方法:
/** *整个方法作为同步代码块 */ synchronized void function1() { }
对整个方法使用synchronized加锁,同时只能有一个线程可以执行该方法,会使执行性降低,所以一般情况下尽量不要对整个方法加锁,而应该使用较小的同步代码块。
3.2重入
可重入是指,某个线程可以重复获得自己已经持有的锁,而不会阻塞,即获取锁的粒度是“线程”。
4.用锁保护状态
对于可能被多个线程同时访问的可变状态变量,在访问它是都需要持有同一个锁,即该状态变量是由这个锁保护的。
对于包含多个变量的不变性条件,其中涉及的所有变量都要由同一个锁来保护。
5.活跃性与性能
通常,在简单性与性能之间存在相互制约关系,当实现某个同步策略时,一定不要盲目的为了性能而牺牲简单性(这样可能会破坏安全性)。
当执行时间较长的计算或者可能无法快速完成的操作时一定不要持有锁(比如,网络或控制台I/O,数据库查询等)
相关推荐
### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...
《良葛格的Java学习笔记》是一本专为Java初学者设计的教程,作者林信良深入浅出地讲解了Java编程的基础知识。这本笔记覆盖了Java学习的重要概念,包括但不限于以下几个方面: 1. **Java简介**:Java是一种跨平台、...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和安全性著称。这篇"Java学习笔记"涵盖了基础知识和一些关键概念,如集合和线程,这些都是Java开发者必备的知识。 1. **Java基础**: Java的基础包括...
8. **线程与并发**:在多核处理器环境下,第17章会介绍如何在Java中创建和管理线程,以及并发编程的基本概念和工具,如synchronized关键字和ExecutorService。 9. **反射与注解**:第18章可能会涉及Java的反射机制...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。这些"java核心笔记"涵盖了基础知识,是学习Java编程的绝佳起点。笔记共分为17天的学习内容,这意味着它将逐步引导你深入理解Java的核心...
它的设计目标是具有简单性、面向对象、健壮性、安全性、可移植性等特性,使得Java成为跨平台应用开发的首选语言。在"韩顺平Java视频"教程中,初学者将能够系统地学习到Java的基础知识。 1. **Java环境搭建**:首先...
这份"JAVASE 笔记"显然是一份深入学习Java SE的重要资料,由"黑马程序员"提供,这是一家知名的在线编程教育机构,以其详尽的教程和实战项目著称。现在,让我们一起深入探讨Java SE中的关键知识点。 1. **Java基础**...
《Java编程学习笔记——以“licanbin.zip”为例》 在编程的世界里,Java以其跨平台、面向对象和高效性的特点,成为了开发者们热衷的学习语言之一。本篇文章将结合“licanbin.zip”这个压缩包文件,深入探讨Java编程...
1. **并发编程**:理解和运用线程同步机制,如Java的synchronized关键字或Lock接口。 2. **支付接口集成**:与第三方支付平台(如支付宝、微信支付)的API对接。 3. **事件驱动编程**:理解异步处理和消息队列,如...
【标题】"Aep-3.2-Programacao-2" 指的可能是某个编程课程或项目,可能是一个关于程序设计的第三版第2阶段的学习资源。在IT行业中,"Programação"(编程)是核心技能之一,尤其是在Java语言的环境中。Java是一种...
6. 多线程:掌握并发编程的基础,如线程的创建、同步和通信,了解synchronized关键字、wait()、notify()方法。 7. 异常处理:学习如何使用try-catch-finally语句块进行错误处理,理解不同类型的异常及其区别。 8. ...