锁机制

synchronized和ReentrantLock区别

*爱你&永不变心* 提交于 2019-12-10 03:10:05
一.什么是 sychronized sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类. 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默认是当前对象作为锁的对象. 在修饰类时候默认是当前类的Class对象作为锁的对象. synchronized会在进入同步块的前后分别形成monitorenter和monitorexit字节码指令.在执行monitorenter指令时会尝试获取对象的锁,如果此没对象没有被锁,或者此对象已经被当前线程锁住,那么锁的计数器加一,每当monitorexit被锁的对象的计数器减一.直到为0就释放该对象的锁.由此synchronized是可重入的,不会出现自己把自己锁死. 二.什么ReentrantLock 以对象的方式来操作对象锁.相对于sychronized需要在finally中去释放锁 三.synchronized和ReentrantLock的区别 除了synchronized的功能,多了三个高级功能. 等待可中断,公平锁,绑定多个Condition. 1.等待可中断 在持有锁的线程长时间不释放锁的时候,等待的线程可以选择放弃等待. tryLock(long timeout, TimeUnit unit) 2.公平锁 按照申请锁的顺序来一次获得锁称为公平锁

synchronized 持有的锁分析?是对象的锁还是类的锁?

空扰寡人 提交于 2019-12-03 16:03:25
1. synchronized 关键字是用来控制多线程同步时候使用的一种方式,在多线程的状态下,控制synchronized代码段不被多个线程同时执行。可以加在一段代码上,也可以加在方法上。 2.synchronized实现的锁机制是一种不公平的锁,在某种意义上,可能导致某些线程的饥饿,但相比于公平锁能提高吞吐率。 3. 不要认为随意的给方法或者代码块上面加上synchronized就可以实现锁 请看下面的代码 class Sync { public synchronized void test() { System.out.println("test开始.."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("test结束.."); } } class MyThread extends Thread { public void run() { Sync sync = new Sync(); sync.test(); } } public class Main { public static void main(String[] args) { for (int i = 0; i < 3; i++) { Thread

数据库的锁机制

て烟熏妆下的殇ゞ 提交于 2019-11-28 14:24:40
在 MySQL事务隔离 中已经提到了事务隔离级别和脏读、不可重复读、幻读产生的原因。为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念。 并发控制 在计算机科学,特别是程序设计、操作系统、多处理机和数据库等领域,并发控制( Concurrency control )是确保及时纠正由并发操作导致的错误的一种机制。 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。下面举例说明并发操作带来的数据不一致性问题: 现有两处火车票售票点,同时读取某一趟列车车票数据库中车票余额为 X。两处售票点同时卖出一张车票,同时修改余额为 X -1写回数据库,这样就造成了实际卖出两张火车票而数据库中的记录却只少了一张。 产生这种情况的原因是因为两个事务读入同一数据并同时修改,其中一个事务提交的结果破坏了另一个事务提交的结果,导致其数据的修改被丢失,破坏了事务的隔离性。并发控制要解决的就是这类问题。 封锁 、 时间戳 、 乐观并发控制 (乐观锁)和 悲观并发控制 (悲观锁)是并发控制主要采用的技术手段。 锁 当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。锁就是其中的一种机制。 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制