2019独角兽企业重金招聘Python工程师标准>>>

什么是线程安全

如果对象的状态变量(对象的实例域、静态域)具有可变性,那么当该对象被多个线程共享时就的考虑线程安全性的问题,否则很可能出现与预期不同的结果。

线程安全是指:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程如何交替执行,该类始终能表现出正确的行为。

一个类是否线程安全的,取决于两点:是否被多线程共享;状态是否可变。单线程环境中不涉及变量共享,不会产生线程安全性问题。多线程环境中共享无状态的对象和状态不可变的对象也不会产生线程安全性问题。

原子性

对于计数器counter++这种由“ 读取-修改-写入 ”组合而成的操作,在执行过程中必须当做是一个整体不被分割,不能被打断, 三个子操作要么完全都不执行,要么三个按顺序依次都执行。

加锁机制

解决线程安全问题的办法就是使用加锁这一同步机制。由于锁能使其保护的代码段以串行形式来访问,相当于让线程以独占的方式来访问状态变量,因此提供了很好的安全性。加锁需要注意一下几点:
1、A线程在获得对象O的锁S之后,B线程如果要获取锁 S 就必须等待A释放锁,但是B任然可以访问对象O的其他未被S加锁的方法(非同步方法 或者 用其他对象作为锁的方法),因此对同一状态变量(或者组合状态)的同步必须使用同一个对象作为锁,否则任然会出现线程安全问题。

2、频繁的获取锁和释放锁本身就很消耗性能,因此在加锁时需要注意一下事项:

A)、只有被多线程同时访问的可变数据才需要加锁保所,为单线程或共享不可变数据而加锁不仅毫无意义,而且耗了性能。

B)、尽量将不影响共享状态且执行时间较长的操作移到同步代码块之外, 使同步代码块的执行时间缩短,也使正在等待的线程在拿到锁之前先将这些操作执行完,一旦拿到锁就可以快速执行完。

C)、同步代码块不应拆解的过细,需要在安全性、简单性和性能上进行权衡。

以上就是简单介绍下java并发编程与线程安全,如有表述不当敬请谅解!

转载于:https://my.oschina.net/u/2600520/blog/604417

java并发编程与线程安全相关推荐

  1. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  2. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  3. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

  4. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  5. JAVA并发编程3_线程同步之synchronized关键字

    在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题. 不安全线程分析 public clas ...

  6. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  7. Java并发编程:线程的同步

    <?xml version="1.0" encoding="utf-8"?> Java并发编程:线程的同步 Java并发编程:线程的同步 Table ...

  8. Java并发编程一线程池简介

    推荐:Java并发编程汇总 Java并发编程一线程池简介 为什么我们需要使用线程池? 我们知道线程是一种比较昂贵的资源,我们通过程序每创建一个线程去执行,其实操作系统都会对应地创建一个线程去执行我们的 ...

  9. Java并发编程一线程池的五种状态

    推荐:Java并发编程汇总 Java并发编程一线程池的五种状态 原文地址 Java多线程线程池(4)–线程池的五种状态 正文 线程池的5种状态:Running.ShutDown.Stop.Tidyin ...

最新文章

  1. 使用Windows Server Backup备份恢复Exchange Server 2010数据库
  2. 不改表结构如何动态扩展字段
  3. bootstrap3 徽章_【可预留】不倒翁工作室,数码宝贝 勇气徽章
  4. xgboost之spark上运行-scala接口
  5. Power BI 的 最佳搭档 Excel(基础数据分析)
  6. 一个简单的性能计数器:CodeTimer
  7. 数独游戏技巧从入门到精通_中国茶艺技巧:500集从入门到精通教程,视频+素材+笔记...
  8. 2017.9.12 claris的剑 失败总结
  9. 软件工程学习进度第三周暨暑期学习进度之第三周汇总
  10. 优秀的程序员都应当知道的11个警句
  11. 微型计算机地基本结构,微型计算机地基本结构.ppt
  12. OpenStack 认证服务 KeyStone部署(三)
  13. mmd动作:Fukayomi
  14. 恢复AndroidStudio中误删除的文件
  15. UVC app流程图
  16. QQ通讯组件(网页中的在线客服、唤起QQ临时会话)
  17. 拍好的视频如何添加配乐
  18. CorelDRAW X3 金箔织绣材质特效——金箔绣球(1)
  19. signal 使用介绍
  20. linux还原环境,Linux环境利用恢复被rm意外删除数据文件

热门文章

  1. 第一章——数据结构之绪论
  2. Leetcode 188.买卖股票的最佳时机IV
  3. File Transfer(并查集)
  4. BZOJ2169 连边(动态规划)
  5. django 的 一对多的关系
  6. ios tableview分组间距
  7. 【BZOJ2558】Count on a tree
  8. PHP 和 AJAX MySQL
  9. 8000字干货 | 教你打造电商产品的用户体系
  10. 数据分析不落地?典型案例教会你!