锁
不羁朔风
但行好事,不问前程
展开
-
为什么要加入锁机制
线程可以随意抢占CPU的资源,谁也不知道下一刻谁会抢到资源,这导致线程访问共享数据时出现了问题锁机制是将可能出现问题的代码用锁对象锁起来,被锁起来的代码就叫同步代码块,同一时间只能有一个线程来访问这个同步代码块.这类似于数据库中事务这个概念...原创 2018-11-07 09:52:56 · 2079 阅读 · 0 评论 -
使用java实现一个死锁程序
死锁:在java语言中,死锁是指在两个或者两个以上的线程执行的过程中,因争夺资源而产生的一种互相等待的现象同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。这种情况能避免就避免掉。synchronzied(A锁){synchronized(B锁){ }} ...原创 2018-11-08 21:46:28 · 735 阅读 · 0 评论 -
MySQL 中的行级锁、表级锁和页级锁
行级锁行级锁是 MySQL 中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁分为共享锁和排他锁。特点:加锁开销大,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度最高页级锁页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。采取了折衷的页级锁,一次锁定相邻的一组记录。BDB 支持页级锁。特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定...原创 2018-11-08 21:45:27 · 1904 阅读 · 0 评论 -
CAS
尽管Java1.6为Synchronized做了优化,增加了从偏向锁到轻量级锁再到重量级锁的过度,但是在最终转变为重量级锁之后,性能仍然较低。所谓原子操作类,指的是java.util.concurrent.atomic包下,一系列以Atomic开头的包装类。例如AtomicBoolean,AtomicInteger,AtomicLong。它们分别用于Boolean,Integer,Long类型...原创 2018-11-08 21:44:31 · 245 阅读 · 0 评论 -
可重入锁
同一个线程再次进入同步代码的时候.可以使用自己已经获取到的锁,这就是可重入锁java里面内置锁(synchronized)和Lock(ReentrantLock)都是可重入的比如一个方法是synchronized,递归调用自己,那么第一次已经获得了锁,第二次调用的时候还能进入吗? 直观上当然需要能进入.这就要求必须是可重入的.可重入锁又叫做递归锁 public class Widg...原创 2018-11-07 09:58:01 · 1137 阅读 · 0 评论 -
重量级锁 synchronized
synchronized关键字并非一开始就该对象加上重量级锁,也是从偏向锁,轻量级锁,再到重量级锁的过程。这个过程也告诉我们,假如我们一开始就知道某个同步代码块的竞争很激烈、很慢的话,那么我们一开始就应该使用重量级锁了,从而省掉一些锁转换的开销。互斥锁(重量级锁)也称为阻塞同步、悲观锁重量级锁是依赖对象内部的monitor锁来实现的,而monitor又依赖操作系统的MutexLock(互斥...原创 2018-11-07 09:56:22 · 6084 阅读 · 2 评论 -
自旋锁和自适应自旋锁
自旋锁所谓自旋,就是指当有另外一个线程来竞争锁时,这个线程会在原地循环等待,而不是把该线程给阻塞,直到那个获得锁的线程释放锁之后,这个线程就可以马上获得锁的。锁在原地循环的时候,是会消耗cpu的,就相当于在执行一个啥也没有的for循环。本来一个线程把锁释放之后,当前线程是能够获得锁的,但是假如这个时候有好几个线程都在竞争这个锁的话,那么有可能当前线程会获取不到锁,还得原地等待继续空循环消耗...原创 2018-11-07 09:55:54 · 4148 阅读 · 3 评论 -
轻量级锁
轻量级锁是由偏向锁升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁(又叫做锁膨胀); 轻量级锁也被称为非阻塞同步、乐观锁,因为这个过程并没有把线程阻塞挂起,而是让线程空循环等待,串行执行。轻量级锁适用于那些同步代码块执行的很快的场景,这样,线程原地等待很短很短的时间就能够获得锁了。轻量级锁膨胀之后,就升级为重量级锁了。轻量级锁主要...原创 2018-11-07 09:55:02 · 2898 阅读 · 2 评论 -
偏向锁
它会偏向第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。它通过消除资源无竞争情况下的同步原语,进一步提高了程序的运行性能。...原创 2018-11-07 09:54:34 · 852 阅读 · 1 评论 -
乐观锁和悲观锁
锁从宏观上分类,分为乐观锁和悲观锁乐观锁是一种乐观的思想,每次获取数据的时候都不担心数据会被修改,所以每次获取数据的时候都不会加锁,但是在更新的时候需要判断该数据是否被人修改过.如果数据被其他线程修改,则不进行数据更新,否则,更新.由于数据没有加锁,期间该数据可以被其他线程进行读写操作在数据库中,乐观锁主要通过数据版本记录机制实现,即为数据增加一个版本号,读取数据时将此版本号一同读出,更新...原创 2018-11-07 09:54:07 · 195 阅读 · 0 评论 -
公平锁和非公平锁
原创 2018-11-08 21:47:56 · 2387 阅读 · 0 评论