什么是线程安全
如果对象的状态变量(对象的实例域、静态域)具有可变性,那么当该对象被多个线程共享时就的考虑线程安全性的问题,否则很可能出现与预期不同的结果。
线程安全是指:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程如何交替执行,该类始终能表现出正确的行为。
一个类是否线程安全的,取决于两点:是否被多线程共享;状态是否可变。单线程环境中不涉及变量共享,不会产生线程安全性问题。多线程环境中共享无状态的对象和状态不可变的对象也不会产生线程安全性问题。
原子性
对于计数器counter++这种由“ 读取--->修改--->写入 ”组合而成的操作,在执行过程中必须当做是一个整体不被分割,不能被打断, 三个子操作要么完全都不执行,要么三个按顺序依次都执行。
加锁机制
解决线程安全问题的办法就是使用加锁这一同步机制。由于锁能使其保护的代码段以串行形式来访问,相当于让线程以独占的方式来访问状态变量,因此提供了很好的安全性。加锁需要注意一下几点:
1、A线程在获得对象O的锁S之后,B线程如果要获取锁 S 就必须等待A释放锁,但是B任然可以访问对象O的其他未被S加锁的方法(非同步方法 或者 用其他对象作为锁的方法),因此对同一状态变量(或者组合状态)的同步必须使用同一个对象作为锁,否则任然会出现线程安全问题。
2、频繁的获取锁和释放锁本身就很消耗性能,因此在加锁时需要注意一下事项:
A)、只有被多线程同时访问的可变数据才需要加锁保所,为单线程或共享不可变数据而加锁不仅毫无 意义,而且耗了性能。
B)、尽量将不影响共享状态且执行时间较长的操作移到同步代码块之外, 使同步代码块的执行时间缩 短,也使正在等待的线程在拿到锁之前先将这些操作执行完,一旦拿到锁就可以快速执行完。
C)、同步代码块不应拆解的过细,需要在安全性、简单性和性能上进行权衡。
相关推荐
并发编程——Java线程的6种状态及切换(csdn)————程序
NULL 博文链接:https://m635674608.iteye.com/blog/2216723
并发编程——认识java里的线程(csdn)————程序
通过多线程编程在Java中发现的并发模式和特性——线程、锁、原子等
关于java中线程的一些基础知识详解文档和知识点,内容详细,通俗易懂,非常适合当接触线程知识的同学,以及复习线程理论知识人员
且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行——源自百度百科在并发编程中,我们需要处理两个关键问题:线程之间如何通信和线程之间如何同步,后续篇章将围绕这两个问题进行...
关于java中线程的一些基础知识详解文档和知识点,内容详细,通俗易懂,非常适合当接触线程知识的同学,以及复习线程理论知识人员
创建后状态不能被修改的对象叫作不可变对象。不可变对象天生就是线程安全的。它们的常量(变量)是在构造函数中创建的,既然它们的状态无法被修改,那么这些常量永远不会被改变——不可变对象永远是线程安全的。
80 并发编程面试专题.pdf 81 并发面试题.pdf 82 多线程,高并发.pdf 83 多线程面试59题(含答案)_.pdf 84 分布式缓存 Redis + Memcached 经典面试题!.pdf 85 搞定 HR 面试的 40 个必备问题!.pdf 86 集合框架.pdf ...
关于java中线程的一些基础知识详解文档和知识点,内容详细,通俗易懂,非常适合当接触线程知识的同学,以及复习线程理论知识人员
主要参考资料:java并发编程的艺术、Java并发——同步工具类 二、CountDownLatch(同步倒数计数器)–不仅仅用于多线程 1.作用:允许一个或多个线程等待其他线程完成操作。 CountDownLatch的构造函数...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛...
5)用 Java 写代码来解决生产者——消费者问题。 6)用 Java 编程一个会导致死锁的程序,你将怎么解决? 7) 什么是原子操作,Java 中的原子操作是什么? 8) Java 中的 volatile 关键是什么作用?怎样使用它?在 Java...
线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题。锁正是基于这种思路实现的一种...
多线程支持:Java内建对多线程编程的支持,使并发编程变得更加简单直接。 动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的...
净额从原生Java的Io操作(BIO)到NIO编程,约会NIO高效并发框架——Netty,需要用到Java的基础知识(多线程,网络编程,IO,设计模式尤其是代理模式),介绍了Netty的高级架构设计和核心模块组件,Google上的...
借助Java、Go等多种语言的特长,深度剖析所有主流并发编程模型 基于锁和线程的并发模型是目前最常用的一种并发模型,但是并发编程模型不仅仅只有这一种,本书几乎涵盖了目前所有的并发编程模型。了解和熟悉各种并发...