什么是线程安全?
当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用方代码不必作其他的协调,这个类的行为仍然是正确的,则称这个类是线程安全的类。
无状态的类是线程安全的
如果一个类是无状态的:不包含域也没有引用其他类的域。一次特定计算的瞬时状态会唯一地存在本地变量中,这些本地变量存储在线程的栈中,只有执行线程才能访问。
编写线程安全的代码,本质上就是管理对状态
的访问,而且是共享的
/可变的
状态。
关于状态:一个对象的状态就是该对象的数据,存储在状态变量中,如实例域或静态域,还包括附属对象的域。如HashMap的状态一部分存储在对象本身中,同时也存储到很多Map.Entry对象中。
关于共享:一个变量可以被多个线程同时访问。
关于可变:变量的值在其生命周期内可以改变。
只要有多于一个的线程访问给定的状态变量,而且其中某个线程会写入该变量,此时必须使用同步来协调线程对该变量的访问。
Java中首要的同步机制是synchronized关键字,它提供了独占锁。另外,“同步”还包括volatile变量,显示锁和原子变量的使用。
面对一个有多线程访问隐患的程序,可以从以下三个方法来修复:
1.不要使用跨线程的共享变量;
2.使状态变量变为不可变的;
3.在任何访问状态变量的时候使用同步
注意一开始就将一个类设计成是线程安全的,比在后期重新修复更容易,并且并发访问共享状态变量带来的问题往往不好重现。
另外,设计线程安全的类时,要充分利用优秀的面向对象技术——如封装。
处理并发程序常见的问题:
1.竞争条件 Race Condition
a.原子操作问题
自增,自减操作不是原子操作,是读-改-写复合操作,可以用线程安全的原子变量(在java.util.concurrent.atomic包中)来作为计数器。
b.检查再运行
例如:你观察到一些事情为真(文件x不存在),然后(then)基于你的观察去执行一些动作(创建文件x);事实上,从观察到执行操作的这段时间里,观察结果可能已经失效了(有人在此期间创建了文件x),从而引发错误(非预期的异常,重写数据或者破坏文件)。
再例如惰性初始化。
操作共享状态的复合操作必须是原子的,以避免上面的竞争条件,通过对该复合操作加锁
可以确保其行为是原子的。
问题:只有在写入共享变量时才需要同步么?
3.1节
在java中有哪些保证线程安全的机制或者措施?
锁机制(implicit lock
和explicit lock
)参见 http://nemogu.iteye.com/blog/1409879
分享到:
相关推荐
最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...
Java的BlockingQueue接口(如ArrayBlockingQueue)非常适合实现这一模型,它提供了线程安全的数据插入和移除操作。 在实例中提到的"全部开始 全部停止 单个停止"可能涉及到线程的启动和控制,这可以通过控制线程的...
### Java并发中的线程安全性 #### 1. 引言 随着Java技术的发展以及多核处理器的普及,Java并发编程成为软件开发中的一个重要领域。Java并发控制问题是国内外学者研究的热点之一,特别是在J2SE 1.5版本中引入了`...
java多线程并发的在新窗口
在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...
首先,Java并发编程的核心在于管理线程的并发执行。线程并发的使用可以显著提升程序处理能力,例如在服务器端处理大量用户请求时,如果每个请求都由单独的线程处理,那么处理速度将大大提高。但同时,多线程并发也会...
5. **并发容器**:Java并发库还提供了一些线程安全的集合类,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,这些容器可以在高并发场景下安全地使用。 通过以上知识点的学习,开发者可以深入理解Java多线程编程...
在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的规则,确保线程之间的正确交互。 线程安全可以分为三种类型: 1. 不安全:当多个线程访问共享...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
并发库高级应用\多线程\Java
这些容器内部实现了线程安全的算法,能够在高并发环境下提供高效的数据访问。 此外,Java并发工具类(java.util.concurrent包)提供了许多实用的工具,如ExecutorService、Future、CountDownLatch、CyclicBarrier和...
java多线程与高并发java多线程与高并发java多线程与高并发
在处理查询结果的合并或存储时,尤其需要注意线程安全问题。 ### 7. 错误处理与异常传播 在多线程环境中,捕获和处理异常特别重要。通常,我们需要确保线程池的`shutdownNow()`方法可以在遇到错误时停止所有任务,...
在Java并发编程中,还涉及到多种并发工具类,例如同步容器类和并发容器类。同步容器类使用同步锁来保证线程安全,但可能会影响性能。并发容器类ConcurrentHashMap和CopyOnWriteArrayList等,采用细粒度的锁和弱一致...
在多线程环境下,线程安全和同步问题变得尤为重要。Java提供了多种同步机制,如`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`Lock`接口(包括`ReentrantLock`等)来避免竞态条件和死锁的...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
Java并发多线程是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了...在实际开发中,根据需求选择合适的方式实现并发,并充分考虑线程安全、性能和资源管理等因素,才能写出高质量的Java并发程序。