android如何保证多线程安全,保证线程安全的方式有哪几种?
欢迎关注我的公众号:
![我的公众号](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190606104746.png)
## 什么是线程安全?
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190610101014.png)
## volatile 关键字
保证了有序性,可见性,但是没保证原子性。
由于java的内存模型的原因,线程在修改了共享变量后并不会立即把修改同步到内存中,而是会保存到线程的本地缓存中。
**volatile关键字修饰的变量在线程修改后会立刻同步到主内存中,使该修改对其他线程可见**
## Synchronized 关键字
* sychronized 是java中的内置锁,可以限制线程对代码块或者方法的访问
* sychronized可以修饰类方法,实例方法,代码块
* 在执行sychronized方法或代码块时,线程需要先获取被修饰对象的锁。一次只能有一个线程可以获取到一个对象的锁,同一个线程可以多次获取同一个对象的锁(可重入锁)
* sychronized 不能响应中断,当一个线程在等待锁的时候,调用该线程的interrupt是不起作用的
* 锁的获取和释放是隐式的,进入同步sychronized blocks后会获取锁,离开sychronized blocks后会释放锁
## Obejct类的wait/notify方法
* wait/notify是用于线程同步的方法
* wait方法会使得当前线程放弃调用对象的监控,并使当前线程进入等待。直到调用了该对象的notify方法或者notifyAll方法(语法上是这样设计,但存在例外)
* 可以多次调用对象的wait方法,notify方法只会随机释放一个wait方法等待,与调用顺序无关。如果要释放所有的wait调用可以调用notifyAll方法
* 调用wait的线程有可能会存在interrupt,虚假唤醒的情况,导致wait方法返回,但实际并没有调用对象的notify方法。在使用时通常会搭配一个lock flag和loop使用
## ThreadLocal 实现
ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程。ThreadLocal是一个线程级别的局部变量,下面是线程局部变量(ThreadLocal variables)的关键点:
1. 当使用ThreadLocal维护变量时,若多个线程访问ThreadLocal实例,ThreadLocal为每个使用该变量的线程提供了一个独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。
2. 从线程的角度看,目标变量就像是线程的本地变量,这也是类名中Local所要表达的意思。
首先:ThreadLocal 是一个泛型类,内部有个静态内部类 ThreadLocalMap,使用弱引用的方式保存 ThreadLocal。
在每个线程内部有一个`ThreadLocal.ThreadLocalMap threadLocals = null;`, 这个 map 的 key 就是每个线程的实例.
在 get 或者 put 的时候,会先通过 getMap 拿当前线程绑定的 ThreadLocalMap 对象,如果没有,会创建一个新的对象。以 ThreadLocal 为 key,以泛型为 value。
这样,在访问 ThreadLocal 类的时候,都会通过拿其内部的 ThreadLocalMap,然后再去获得设置的泛型值。
所以就导致,不同的类在内部设置 ThreadLocalMap 以后,确保能够保证同个线程中值是唯一的。
[参考地址](https://www.cnblogs.com/studyLog-share/p/5295557.html)
## 重入锁实现线程同步
Lock,一般使用其实现类 ReentrantLock。
ReentrantLock获取锁定与三种方式:
1. lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
2. tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
3. tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
4. lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断
ReentrantLock 和 Synchronized 的区别:
线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定,
- 如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断
- 如果 使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情
android如何保证多线程安全,保证线程安全的方式有哪几种?相关推荐
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线程的 ...
- Qt 多线程基础及线程使用方式
文章目录 Qt 多线程操作 2.线程类QThread 3.多线程使用:方式一 4.多线程使用:方式二 5.Qt 线程池的使用 Qt 多线程操作 应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一 ...
- 进程/线程同步的方式和机制,进程间通信
一.进程/线程间同步机制. 临界区.互斥区.事件.信号量四种方式 临界区(Critical Section).互斥量(Mutex).信号量(Semaphore).事件(Event)的区别 1.临界区: ...
- JavaFX 中使用多线程与保证 UI 线程安全
JavaFX 中使用多线程与保证 UI 线程安全 JavaFX 中使用多线程 JavaFX 中保证 UI 线程安全 总结与补充 JavaFX 中的 UI 线程和大多数其它的编程语言一样,是单线程的 ...
- java程序中怎么保证多线程的运行安全_Java线程安全问答(草稿)
1.什么是线程安全? 如果一个类在多线程执行中,在不考虑运行环境的调度干预,也不需要调用代码的协调同步,仍然保证正确地运行,那么这个类就是线程安全的 也就是说,多线程环境下,线程安全的类总是有正确的行 ...
- 线程中如何使用对象_在 Flink 算子中使用多线程如何保证不丢数据?
简介: 本人通过分析痛点.同步批量请求优化为异步请求.多线程 Client 模式.Flink 算子内多线程实现以及总结四部分帮助大家理解 Flink 中使用多线程的优化及在 Flink 算子中使用多线 ...
- Android SQLite多线程读写和线程同步源码分析
没啥诀窍,只需保证几个线程都是用的一个SQLiteDataBase对象就行了. 如果我们非要在不同线程中用两个或更多的SQLiteDataBase对象呢,当然这些SQLiteDataBase对象所操作 ...
- controller如何保证当前只有一个线程执行_今天我们来聊一聊 Spring 中的线程安全性...
优质文章,及时送达 Spring与线程安全 Spring作为一个IOC/DI容器,帮助我们管理了许许多多的"bean".但其实,Spring并没有保证这些对象的线程安全,需要由开发 ...
- controller如何保证当前只有一个线程执行_聊聊Spring线程安全,读完之后,大部分程序员收藏了......
Spring作为一个IOC/DI容器,帮助我们管理了许许多多的"bean".但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码. Spri ...
- udp怎么保证不丢包_在 Flink 算子中使用多线程如何保证不丢数据?
分析痛点 笔者线上有一个 Flink 任务消费 Kafka 数据,将数据转换后,在 Flink 的 Sink 算子内部调用第三方 api 将数据上报到第三方的数据分析平台.这里使用批量同步 api,即 ...
最新文章
- CodeForces - 1494D Dogeforces(贪心+构造)
- Maven 项目的 org.junit.Test 获取不到(转载)
- 1562a检测软件_洛达1562a空间音频版评测!!!
- codesys raspberry pi_11月7日|Pi第四次减产来袭?4点浅析中文区用户关心的问题
- 通用权限管理设计 之 数据权限
- qt程序报错“C:\Program Files (x86)\SogouInput\Components\ 15:10:44: 程序异常结束。”
- 2010年会考计算机试题,2010年浙江省信息技术会考试题 选择题 - 多媒体 - 图文
- 家用路由器配置方法(精简版)
- Python自动化完成tb喵币任务V2.0
- Python——类和实例
- 怎么应付薪资倒挂问题
- webpack将部分图片打包后转化为base64
- [前端基础] JavaScript 基础篇(下)
- Python数据分析与可视化(数据分析)
- 工作流引擎 Activiti 入门详解
- vue+h5微信公众号ios系统底部导航栏处理
- php. 生成器 send,PHP生成器细说
- HTML——单元格标签td的属性
- 2023 网站建设中HTML单页源码 自适应
- [纵横网络靶场社区]简单流量分析