java保证线程安全的方式有哪些?
导致线程不安全的原因有,主要有三个:
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保证线程安全的方式有哪些?相关推荐
- 快点来学吧!java保证线程安全的方式
JAVA基础 JAVA异常分类及处理 异常分类 异常的处理方式 Throw和throws的区别 JAVA反射 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) Java反射API 反射使用 ...
- Java创建线程池的方式
Java创建线程池的方式 文章目录 Java创建线程池的方式 一.通过Executors工厂方法创建 1.Executors.newSingleThreadExecutor() 2.Executors ...
- JAVA跨线程传递数据方式总结
实现跨线程传递数据方式: v1:子线程使用主线程的局部变量 这种当主线程和子线程不在一快儿时就不适用.可以使用JDK原生的InheritableThreadLocal. v2:InheritableT ...
- java实现线程三种方式_详解三种java实现多线程的方式
java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...
- Java实现线程同步的方式
1. synchronized关键字 synchronized关键字保证在同一时刻,只有一个线程可以执行某个对象内某一个方法或某一段代码块. 重量级锁.包含两个特征:互斥性和可见性. synchron ...
- java 中线程的创建方式
如果说在java中创建线程的有几种方式的话,归根结底我认为就两种方式 1.继承Thread类,重写run方法 继承Thread类,如下图重写了run()方法 通过start()方法来启动线程 最后的输 ...
- Java 实现线程安全的方式
1.创建线程的三种方式 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 2.线程的生命周期 新建状态: 使用 new 关键字 ...
- Java中线程的实现方式
1.继承Thread类,重写该类的run方法 [线程类 MyThread.java ] package com.baosight.thread;/*** 继承Thread类,重写该类的run方法* @ ...
- java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable
线程 1 线程概述 1.1 什么是线程 v 线程是程序执行的一条路径, 一个进程中可以包含多条线程 v 一个应用程序可以理解成就是一个进程 v 多线程并发执行可以提高程序的效率, 可以同时完成多 ...
最新文章
- 初识WordPress数据库
- localdatetime 默认时间_为什么建议使用你 LocalDateTime ,而不是 Date?
- 鸿蒙不算安卓系统吗,加入鸿蒙≠使用鸿蒙,鸿蒙不属于华为也仅限于华为
- 蓝桥杯练习系统习题-算法训练6
- Bit-Z推出去中心化多链钱包CoinU 打造资产价值生态体系
- 大数据人工智能时代,这个行业终于爆发了!
- 2020年跨行业跨领域工业互联网平台
- catia利用宏批量改名的方法_谁有CATIA批量改名的宏程序啊
- SSH连接Linux CentOS7-Putty篇
- db2dual_db2 oracle 创建 序列 | 学步园
- 【渝粤教育】国家开放大学2018年春季 7406-22T金融统计分析 参考试题
- CorelDRAWX4的VBA插件开发(二)怎么查看开发者PDF文档和VBA内的对象浏览器
- ArrayList源码分析--底层扩容机制
- poi创建数据透视表_从数据透视表创建自定义报告
- 计算机专业研究生读研规划,关于一个计算机研究生人生规划的迷惑
- 测试开发知识总结(一)
- Python转换excel文件,将xlsx文件转换为xls文件
- 用Python制作好玩的小游戏
- 谷歌招聘 变态15题你会做几道?
- 解决Flex项目下bin-debug文件在其他电脑打开不显示的问题
热门文章
- C++ const 修饰符
- 【Linux】Shell特殊符号
- Java架构-别忽视分布式系统这六大“暗流”
- 三星RC420-S09笔记本电脑拆机
- java将字符串分段输出_java输入字符串并将每个字符输出的方法
- 中南计算机博士待遇怎么样,博士的待遇真的有那么好吗?985博士生,来回答你...
- 数学专用词汇的英文表示
- 国外开发者分享如何通过Medium写作赚钱美元
- 打印机连接电脑正常但是文件被挂起是怎么回事?
- 宏碁非凡pro 2023款参数 评测 宏碁非凡pro 2023款值得买吗