乐观锁与悲观锁 悲观锁 假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。如, 关键字使用。 乐观锁 假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。如,CAS(Compare and Swap 比较并交换)。 获得锁后一直持有锁,以防本线程再次申请该锁造成无谓的解锁再加锁开销。 假 ...
分类:
其他好文 时间:
2018-08-04 23:21:59
阅读次数:
208
前言 在高并发的应用当中,最关键的问题就是对共享变量的安全访问,通常我们都是通过加锁的方式,比如说synchronized、Lock来保证原子性,或者在某些应用当中,用voliate来保证变量的可见性,还有就是通过TheadLocal将变量copy一份,称为局部变量(线程私有)等等。现在我们学习一种 ...
分类:
编程语言 时间:
2018-08-04 13:38:16
阅读次数:
203
[TOC] 1.1 简介 本章介绍在C 中实现线程同步的几种方法。因为多个线程同时访问共享数据时,可能会造成共享数据的损坏,从而导致与预期的结果不相符。为了解决这个问题,所以需要用到线程同步,也被俗称为“加锁”。但是 加锁绝对不对提高性能,最多也就是不增不减 ,要实现性能不增不减还得靠高质量的 同步 ...
分类:
编程语言 时间:
2018-08-03 22:38:56
阅读次数:
263
1、线程安全的HashMap 如果需要一个线程安全的HashMap ,可以使用集合工具类的synchronizedMap(Map<K,V> m)方法实现, 进到方法里面, 它返回一个内部类,进入内部类 发现它是用的代理的方法来实现的,所有功能全都由传进来的Map,也就是m实现,它只负责给方法加锁。如 ...
分类:
编程语言 时间:
2018-08-03 16:28:13
阅读次数:
136
保证线程安全演进: synchronized volatile AtomicInteger Lock接口提供的方法: void lock():加锁 void unlock():解锁 void lockInterruptibly():在多个线程并发获取锁的时候,那么,当有些线程拿不到锁时会等待,会不停 ...
分类:
编程语言 时间:
2018-08-02 10:20:07
阅读次数:
129
本篇为大家讲解解决多线程线程安全问题的另一种思路,同步锁:synchronized和ReentrantLock。二者都是锁机制实现线程安全,但ReentrantLock的使用更加灵活,更有读写分离锁,适用于读多写少的场景。下面为大家演示二者的使用模版。 一、synchronized(同步方法体、同步 ...
分类:
编程语言 时间:
2018-08-02 01:55:59
阅读次数:
139
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置 ...
分类:
编程语言 时间:
2018-08-01 22:21:06
阅读次数:
188
什么是超时等待? 调用一个方法时,等待一段时间(一般给定一个时间段),如果该方法能够在给定的时间段内得到结果,那么将结果立刻返回,反之,超时返回默认结果。这就是超时等待。 等待/通知的经典范式,即加锁,条件循环和处理逻辑三个步骤,而这种范式无法做到超时等待。 等待/通知的经典范式,可以分为两部分,分 ...
分类:
其他好文 时间:
2018-08-01 11:41:21
阅读次数:
138
在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术: 加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。 如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。看下面这个例子: 如果一个线程(比如线程3)需要一些锁,那么它必须按照确定的顺序获取锁 ...
分类:
编程语言 时间:
2018-07-30 21:32:26
阅读次数:
173
一 同步类容器同步类容器都是线程安全的,但在某些场景中可能需要加锁来保证复合操作。 符合操作如:迭代(反复访问元素,遍历完容器中所有元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、条件运算。这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的ConcurrentModifi ...
分类:
其他好文 时间:
2018-07-30 14:46:20
阅读次数:
173