(1)Java中的主要同步机制是关键字synchronized,它提供了一种独占的加锁方式,但“同步”这个术语还包括volatile类型的变量,显式锁以及原子变量。 (2)线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。 (3)要避免竞态条件问题,就必 ...
分类:
编程语言 时间:
2019-02-11 14:09:40
阅读次数:
153
解法一:只适合单线程环境(不好) 注解:Singleton的静态属性instance中,只有instance为null的时候才创建一个实例,构造函数私有,确保每次都只创建一个,避免重复创建。缺点:只在单线程的情况下正常运行,在多线程的情况下,就会出问题。例如:当两个线程同时运行到判断instance ...
分类:
编程语言 时间:
2019-02-10 12:18:20
阅读次数:
164
InnoDB是一个支持行锁的存储引擎,它有三种行锁的算法: Record Lock:行锁,单个行记录上的锁。 Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止幻读、防止间隙内有新数据插入、防止已存在的数据更新为间隙内的数据。 Next-Key Lock:1+2,锁... ...
分类:
数据库 时间:
2019-02-10 00:12:00
阅读次数:
451
数据结构 jdk1.8:数组、链表/红黑树,同HashMap(jdk1.7 分段数组+链表) 线程安全的实现 jdk1.7,分段锁,每次只锁住一个分段,不同分段的数据可以并发修改,提高了并发访问率 jdk1.8,synchronized+CAS,对链表/红黑树的首节点加锁,只要hash不一样就不会冲 ...
分类:
其他好文 时间:
2019-02-09 20:51:20
阅读次数:
171
golang中的channel channel用于goroutine之间的通信 如果不用channel,使用共享全局变量的方式,需要加锁 使用同步锁并发效率会很低 channel主要用于goroutine通信和解决主线程等待goroutine执行结束再退出的问题 basic concept of c ...
分类:
其他好文 时间:
2019-02-08 23:34:00
阅读次数:
286
1. ReentrantLock的介绍 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchroni ...
分类:
其他好文 时间:
2019-02-08 20:17:44
阅读次数:
201
1. ThreadLocal的简介 在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题,但是这种加锁的方式会让未获取到锁的线程进行阻塞等待,很显然这种方式的时间效率并不是很好。线程安全问题的核心在于多个线程会对同一个临 ...
分类:
其他好文 时间:
2019-02-08 20:10:36
阅读次数:
181
乐观锁 乐观锁是逻辑概念上的锁,不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。 通常实现是这样的:在表中的数据进行操作时(更新),先给数... ...
分类:
数据库 时间:
2019-02-07 00:00:39
阅读次数:
247
HashTable线程安全,效率非常低,锁的资源竞争 多线程共享同一个HashTable HashTable加锁了,影响效率。每次只能有一个线程去操作 put 和 get 只能有一个线程可以操作。 jdk5之后,引入了CurrentHashMap<K,V> 分段锁: 一个整体拆分成16段。每段是一个 ...
分类:
其他好文 时间:
2019-02-05 09:12:21
阅读次数:
176
concurrent包下的很多框架实现基本都依赖于AQS ,而AQS底层依赖LockSupport ,LockSupport依赖Unsafe提供的能力进行加锁等操作 1.park() unpark() 内部基于互斥量机制 permit初始值为0 park():如果permit等于0 阻塞;如果per ...
分类:
其他好文 时间:
2019-02-04 12:56:30
阅读次数:
173