欢迎关注我的公众号:

![我的公众号](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如何保证多线程安全,保证线程安全的方式有哪几种?相关推荐

  1. Win32多线程编程(3) — 线程同步与通信

    一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线程的 ...

  2. Qt 多线程基础及线程使用方式

    文章目录 Qt 多线程操作 2.线程类QThread 3.多线程使用:方式一 4.多线程使用:方式二 5.Qt 线程池的使用 Qt 多线程操作 应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一 ...

  3. 进程/线程同步的方式和机制,进程间通信

    一.进程/线程间同步机制. 临界区.互斥区.事件.信号量四种方式 临界区(Critical Section).互斥量(Mutex).信号量(Semaphore).事件(Event)的区别 1.临界区: ...

  4. JavaFX 中使用多线程与保证 UI 线程安全

    JavaFX 中使用多线程与保证 UI 线程安全 JavaFX 中使用多线程 JavaFX 中保证 UI 线程安全 总结与补充   JavaFX 中的 UI 线程和大多数其它的编程语言一样,是单线程的 ...

  5. java程序中怎么保证多线程的运行安全_Java线程安全问答(草稿)

    1.什么是线程安全? 如果一个类在多线程执行中,在不考虑运行环境的调度干预,也不需要调用代码的协调同步,仍然保证正确地运行,那么这个类就是线程安全的 也就是说,多线程环境下,线程安全的类总是有正确的行 ...

  6. 线程中如何使用对象_在 Flink 算子中使用多线程如何保证不丢数据?

    简介: 本人通过分析痛点.同步批量请求优化为异步请求.多线程 Client 模式.Flink 算子内多线程实现以及总结四部分帮助大家理解 Flink 中使用多线程的优化及在 Flink 算子中使用多线 ...

  7. Android SQLite多线程读写和线程同步源码分析

    没啥诀窍,只需保证几个线程都是用的一个SQLiteDataBase对象就行了. 如果我们非要在不同线程中用两个或更多的SQLiteDataBase对象呢,当然这些SQLiteDataBase对象所操作 ...

  8. controller如何保证当前只有一个线程执行_今天我们来聊一聊 Spring 中的线程安全性...

    优质文章,及时送达 Spring与线程安全 Spring作为一个IOC/DI容器,帮助我们管理了许许多多的"bean".但其实,Spring并没有保证这些对象的线程安全,需要由开发 ...

  9. controller如何保证当前只有一个线程执行_聊聊Spring线程安全,读完之后,大部分程序员收藏了......

    Spring作为一个IOC/DI容器,帮助我们管理了许许多多的"bean".但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码. Spri ...

  10. udp怎么保证不丢包_在 Flink 算子中使用多线程如何保证不丢数据?

    分析痛点 笔者线上有一个 Flink 任务消费 Kafka 数据,将数据转换后,在 Flink 的 Sink 算子内部调用第三方 api 将数据上报到第三方的数据分析平台.这里使用批量同步 api,即 ...

最新文章

  1. CodeForces - 1494D Dogeforces(贪心+构造)
  2. Maven 项目的 org.junit.Test 获取不到(转载)
  3. 1562a检测软件_洛达1562a空间音频版评测!!!
  4. codesys raspberry pi_11月7日|Pi第四次减产来袭?4点浅析中文区用户关心的问题
  5. 通用权限管理设计 之 数据权限
  6. qt程序报错“C:\Program Files (x86)\SogouInput\Components\ 15:10:44: 程序异常结束。”
  7. 2010年会考计算机试题,2010年浙江省信息技术会考试题 选择题 - 多媒体 - 图文
  8. 家用路由器配置方法(精简版)
  9. Python自动化完成tb喵币任务V2.0
  10. Python——类和实例
  11. 怎么应付薪资倒挂问题
  12. webpack将部分图片打包后转化为base64
  13. [前端基础] JavaScript 基础篇(下)
  14. Python数据分析与可视化(数据分析)
  15. 工作流引擎 Activiti 入门详解
  16. vue+h5微信公众号ios系统底部导航栏处理
  17. php. 生成器 send,PHP生成器细说
  18. HTML——单元格标签td的属性
  19. 2023 网站建设中HTML单页源码 自适应
  20. [纵横网络靶场社区]简单流量分析

热门文章

  1. sinx泰勒展开_求极限:泰勒公式应展开到第几阶?
  2. 听演讲的随笔--教育的最终目的是社会阶级分层
  3. Win7下Hyenae的安装
  4. 南无阿弥陀佛是什么意思呢
  5. Python 实现的、带GUI界面的词云生成器
  6. SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了
  7. 如何免费复制网页内容
  8. python语言的就业方向_Python语言就业方向
  9. hack the box(5985 WinRM)
  10. 解决postgre报错ERROR #22P02 malformed array literal