上篇提到线程针对临界值操作时需要加锁,但是线程访问临界资源只通过锁来控制是不够的。 比如对一个数据进行操作,A线程需要读,B线程进行写。 A线程先访问临界资源,发现没有数据可以读,只能等待B线程先写,此时又占用了互斥锁,导致B线程无法得到锁,进行写操作。 此时就需要用到条件变量了,条件变量的目的就是 ...
分类:
编程语言 时间:
2016-05-02 22:58:47
阅读次数:
235
在使用线程时,经常要注意的就是访问临界资源加锁。 在编码过程由于粗心忘记加锁将带来不可预知的错误。这类错误单次运行或小并发时难以复现,当数据量变大,用户数增多时,轻则系统崩溃,大则引起数据错误。造成损失。 线程中互斥锁与进程的信号量类似,也可以看做是PV操作,用于保护临界资源,确保只有一个线程访问。... ...
分类:
编程语言 时间:
2016-05-02 21:29:28
阅读次数:
293
学习过并发编程的同学应该对volatile关键字并不陌生。它也是用来保证多线程读写数据时保证数据的一致性,但它不如synchronized强大。synchronized是在执行代码块或是方法体时中隐式的加锁而禁止其他线程来访问。而volatile仅仅是对某个变量的修改及时的可见于其他的线程...
分类:
其他好文 时间:
2016-05-02 11:54:51
阅读次数:
236
前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎 ...
分类:
数据库 时间:
2016-05-01 19:15:20
阅读次数:
280
一、什么是事务事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml(数据操作语言,增删改,没有查询)语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用于保证数据的一致性。 二、事务和锁当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户 ...
分类:
数据库 时间:
2016-05-01 16:08:00
阅读次数:
231
之前写了一些辅助工作相关的Spring Boot怎么使用AOP。这里继续正题,怎么减少Spring Boot 乐观锁加锁报错的情况(基本可以解决)。 1. 包依赖 spring-boot-starter-data-jpa, Spring Boot的JPA starter h2, H2内存数据库 sp ...
分类:
编程语言 时间:
2016-05-01 13:31:24
阅读次数:
759
除了加锁外,其实还有一种方式可以防止并发修改异常,这就是将读写分离技术(不是数据库上的)。 先回顾一下一个常识: 1、JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个对象,一个线程获取这个引用指向的对象,那么他们之间不会发生ConcurrentModificatio ...
分类:
其他好文 时间:
2016-04-30 18:08:47
阅读次数:
128
ThreadLocal为每个使用该变量的线程提供独立的变量副本,即每个线程内部都会有一个该变量,且在线程内部任何地方都可以使用,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
对比同步机制与ThreadLocal,可以得出同步通过加锁的方式实现了线程数据共享,也就是以时间换空间,而Th...
分类:
编程语言 时间:
2016-04-29 19:57:18
阅读次数:
200
1 背景 1
1.1 MVCC:Snapshot
Read vs Current Read 2
1.2 Cluster
Index:聚簇索引 3
1.3 2PL:Two-Phase
Locking 3
1.4 Isolation
Level 4
2 一条简单SQL的加...
分类:
数据库 时间:
2016-04-29 16:45:30
阅读次数:
266
乐观锁: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而 言,这样的开销往往无法承受。而乐观锁机制在一定程度上解决了这 ...
分类:
其他好文 时间:
2016-04-27 12:52:17
阅读次数:
179