当我们说线程安全的时候,我们到底在说什么?

Google上给出的概念是:如果一个对象能被多个线程安全的同时使用,那该对象就是安全的。《Java Concurrency Practice》一书中给出的定义是:当多个线程访问同一个对象时,如果不考虑这些线程在运行时环境如何调度和交替执行,也不需要额外的同步,或者在调用方进行其他任何的协调操作,调用该对象都能得到正确的结果,那该对象就是线程安全的。

Java中线程安全的实现方式:

1. 悲观锁:synchronized关键字,lock 都属于悲观锁。

悲观锁是指,一个线程在访问某对象时,必须对对象加锁禁止其他对象的访问或者修改,否则假定一定会出现错误。很显然,该假设太强,所以会对系统的效率造成一定的损失,尤其是在多读的环境中。

2.乐观锁:

乐观锁是指,线程对更新保持一个乐观的态度,即假设修改某对象不会出现同步错误而不加锁,而出现同步错误再返回错误。错误检测的实现主要通过版本号的比较来实现。Hibernate框架中,可以选择事务加锁类型为乐观锁还是悲观锁。

3.volatile关键字

volatile关键字主要保证了有序性和可见性,但是对操作的原子性并不能保证,所以在使用volatile关键字替代锁机制的时候,需要两个条件:即对volatile变量的修改既不取决于变量的当前状态,也不取决于程序的当前状态。

4.concurrent包内的其他线程安全的类:如原子类,concurentHashMap等等

Java线程安全的实现方法相关推荐

  1. 求一个简单的java线程代码,Java线程代码的实现方法

    1.继承Thread 声明Thread的子类 运行thread子类的方法 2.创建Thread的匿名子类 3.实现Runnable接口 声明 运行 4.创建实现Runnable接口的匿名类 5.线程名 ...

  2. 停止Java线程,小心interrupt()方法

    转自http://www.blogjava.net/jinfeng_wang/archive/2008/04/27/196477.html 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的 ...

  3. TIL:创建Java线程的两种方法

    Java最强大的功能之一是它允许人们轻松管理线程以执行程序中的各种任务. 正确使用线程可以提高程序的效率. 也就是说,今天我了解了创建这些线程的两种方法: 第一种方法:实现可运行 Runnable是抽 ...

  4. 模拟做饭系统(java+线程中的join方法)

    (一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...

  5. Java线程池的使用方法

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

  6. Java线程之两种方法Runnable和Thread的区别

    在java中有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口: 1>Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的 ...

  7. Thread之四:java线程返回结果的方法

    两种方式:一种继承Thread类实现:一种通过实现Callable接口. 第一种方法: 因为实现Thread类的run方法自身是没有返回值的,所以不能直接获得线程的执行结果,但是可以通过在run方法里 ...

  8. java线程同步的各种方法

    原子操作:由一组相关的操作完成,这些操作可能会操纵与其它的线程共享的资源,为了保证得到正确的运算结果,一个线程在执行原子操作其间,应该采取其他的措施使得其他的线程不能操纵共享资源. 原子操作:根据Ja ...

  9. Java线程中的sleep方法详解

    文章目录 1.关于线程的sleep方法 2.分析哪个线程休眠的 3.终止线程的休眠 4.终止线程 强行终止线程 合理的终止线程 1.关于线程的sleep方法 static void sleep(lon ...

最新文章

  1. Mac终端下打开sublime
  2. reactjs组件通信方式总结
  3. Picasso-源码解析(二)
  4. mysql优化积累(持续更新中)
  5. 学习ASP.NET Core,你必须了解无处不在的“依赖注入”
  6. Mac 下配置XAMPP
  7. 20172316 2017-2018-2《程序设计与数据结构》第七周学习总结
  8. Qt5Widgetsd.lib(Qt5Widgetsd.dll) : fatalerror LNK1112: 模块计算机类型“x64”与目标计算机类型“X86”冲突
  9. (日常搬砖)数据集标注格式转换:txt转xml(VOC格式)
  10. Matlab关于转置与共轭转置
  11. 扩容卡检测(win下,能作为参考)
  12. 数据结构Status
  13. NTFS与FAT 32的区别
  14. abb机器人工具坐标系设定方式_实用 | ABB机器人如何设定工具坐标系?
  15. 七年级计算机会考重点知识点总结,七年级语文期中考试复习知识点总结
  16. java手风琴代码_[Java教程]18款jquery抽屉式手风琴导航特效代码
  17. wpf-简单悬浮窗的定位问题
  18. springboot ruoyi
  19. org.springframework.jdbc.BadSqlGrammarException: Error updating database
  20. 使用Python3将word文档和pdf电子书进行格式互转(兼容Windows/Linux)

热门文章

  1. 带着问题读源码-soul(2021-01-15)
  2. 企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  3. 从书中学爬虫靠谱吗?深夜读《爬虫实战 从数据到产品》
  4. 安装vs2015_community()社区版+win10,安装之后,打开项目显示不兼容,应用程序未能正确安装
  5. 二次元PHP随机api接口源码,随机二次元图片API接口php源码
  6. 瑞康医药携手亚马逊云科技,推动云上医药创新
  7. 原 Java课前总结与课后习题原 Java课前总结与课后习题
  8. java 文件格式转换
  9. 奔跑吧扑倒大作战服务器信息,奔跑吧扑倒大作战
  10. 工业相机的靶面尺寸怎么算