导致线程不安全的原因有,主要有三个:
1.原子性:一个或者多个操作在CPU执行过程中被中断
2.可见性:一个线程共享变量的修改,导致另一个线程不能立即看到
3.有序性:程序执行的顺序没有按照代码的先后顺序执行

java平台编译器:静态编译器javac(加载后直接执行),动态编译器jit(.class文件再编译成机器码,可能会对指令进行重排序,指定的内存访问顺序跟源代码编写不一致)。

针对原子性,
1.JDK提供的Atomic类,通过CAS来保证原子性。比如AtomicInteger、AtomicLong、AtomicBoolean等。
2.java提供了各种锁机制,比如synchronized关键字。

针对可见性,
1.使用synchronized关键字加锁来解决
2.java提供volatile关键字,比synchronized关键字性能更优

针对有序性,
1.使用synchronized关键字定义同步代码块或同步方法
2.通过lock接口来保证有序性

同时,针对不同的应用场景,还可以使用分布式锁来实现线程安全,比较常用的分布式锁实现方式有,基于数据库实现的分布式锁(不常用,除非是单数据库,但是不便于后期扩展),基于redis实现的分布式锁、基于zookeeper实现的分布式锁。还有一种就是使用ThreadLocal来进行线程隔离。ThreadLocal类是作为线程内部的局部变量而提供的。让这些变量在多线程环境下访问(get/set)时能保证各个线程里的变量相对独立于其他线程内的变量。通过ThreadLocal创建的变量只能被当前线程访问,对其他线程不可见,故别的线程无法访问和修改,也就是说:对线程公有化变成对线程私有化。事实上每个线程中都有一个ThreadLocal变量副本。
相比于锁的性能:
java在使用锁的使用中会导致运行效率降低,ThreadLocal的使用彻底避免对共享资源的竞争,同时又可以不影响效率。ThreadLocal采⽤了“以空间换时间”的⽅式,为每⼀个线程都提供⼀份变量的副本,从⽽实现同时访问⽽互不影响,但因为每个线程都维护着⼀份副本,对内存空间的占⽤会增加。

java保证线程安全的方式有哪些?相关推荐

  1. 快点来学吧!java保证线程安全的方式

    JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...

  2. Java创建线程池的方式

    Java创建线程池的方式 文章目录 Java创建线程池的方式 一.通过Executors工厂方法创建 1.Executors.newSingleThreadExecutor() 2.Executors ...

  3. JAVA跨线程传递数据方式总结

    实现跨线程传递数据方式: v1:子线程使用主线程的局部变量 这种当主线程和子线程不在一快儿时就不适用.可以使用JDK原生的InheritableThreadLocal. v2:InheritableT ...

  4. java实现线程三种方式_详解三种java实现多线程的方式

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...

  5. Java实现线程同步的方式

    1. synchronized关键字 synchronized关键字保证在同一时刻,只有一个线程可以执行某个对象内某一个方法或某一段代码块. 重量级锁.包含两个特征:互斥性和可见性. synchron ...

  6. java 中线程的创建方式

    如果说在java中创建线程的有几种方式的话,归根结底我认为就两种方式 1.继承Thread类,重写run方法 继承Thread类,如下图重写了run()方法 通过start()方法来启动线程 最后的输 ...

  7. Java 实现线程安全的方式

    1.创建线程的三种方式 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 2.线程的生命周期 新建状态: 使用 new 关键字 ...

  8. Java中线程的实现方式

    1.继承Thread类,重写该类的run方法 [线程类 MyThread.java ] package com.baosight.thread;/*** 继承Thread类,重写该类的run方法* @ ...

  9. java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable

    线程 1 线程概述 1.1 什么是线程 v  线程是程序执行的一条路径, 一个进程中可以包含多条线程 v  一个应用程序可以理解成就是一个进程 v  多线程并发执行可以提高程序的效率, 可以同时完成多 ...

最新文章

  1. 初识WordPress数据库
  2. localdatetime 默认时间_为什么建议使用你 LocalDateTime ,而不是 Date?
  3. 鸿蒙不算安卓系统吗,加入鸿蒙≠使用鸿蒙,鸿蒙不属于华为也仅限于华为
  4. 蓝桥杯练习系统习题-算法训练6
  5. Bit-Z推出去中心化多链钱包CoinU 打造资产价值生态体系
  6. 大数据人工智能时代,这个行业终于爆发了!
  7. 2020年跨行业跨领域工业互联网平台
  8. catia利用宏批量改名的方法_谁有CATIA批量改名的宏程序啊
  9. SSH连接Linux CentOS7-Putty篇
  10. db2dual_db2 oracle 创建 序列 | 学步园
  11. 【渝粤教育】国家开放大学2018年春季 7406-22T金融统计分析 参考试题
  12. CorelDRAWX4的VBA插件开发(二)怎么查看开发者PDF文档和VBA内的对象浏览器
  13. ArrayList源码分析--底层扩容机制
  14. poi创建数据透视表_从数据透视表创建自定义报告
  15. 计算机专业研究生读研规划,关于一个计算机研究生人生规划的迷惑
  16. 测试开发知识总结(一)
  17. Python转换excel文件,将xlsx文件转换为xls文件
  18. 用Python制作好玩的小游戏
  19. 谷歌招聘 变态15题你会做几道?
  20. 解决Flex项目下bin-debug文件在其他电脑打开不显示的问题

热门文章

  1. C++ const 修饰符
  2. 【Linux】Shell特殊符号
  3. Java架构-别忽视分布式系统这六大“暗流”
  4. 三星RC420-S09笔记本电脑拆机
  5. java将字符串分段输出_java输入字符串并将每个字符输出的方法
  6. 中南计算机博士待遇怎么样,博士的待遇真的有那么好吗?985博士生,来回答你...
  7. 数学专用词汇的英文表示
  8. 国外开发者分享如何通过Medium写作赚钱美元
  9. 打印机连接电脑正常但是文件被挂起是怎么回事?
  10. 宏碁非凡pro 2023款参数 评测 宏碁非凡pro 2023款值得买吗