悲观锁乐观锁定义Java,JAVA乐观锁
如何解决写爬虫IP受阻的问题?立即使用。
面试题目:
乐观锁和悲观锁的区别
(学习视频分享:java教学视频)
I .乐观锁定
我一直认为不会有并发问题。每次取数据的时候,我总是认为没有其他线程会修改数据,所以不会被锁定。但是在更新的时候,我会判断之前是否有其他线程修改过数据,这通常是利用版本号机制或者CAS操作来实现的。
版本模式:
通常,数据版本号版本字段被添加到数据表中,以指示数据被修改的次数。当数据被修改时,版本值将增加1。当线程A想要更新数据值时,它也会在读取数据的同时读取版本值。在提交更新时,如果刚刚读取的版本值等于当前数据库中的版本值,则它将被更新。否则,它将重试更新操作,直到更新成功。
更新表集x=x ^ 1,版本=版本1其中id=#{id},版本=#{version}。(相关面试问题推荐:java面试问答)
CAS操作模式:
比较和交换或比较和设置涉及三个操作数,即数据所在的内存值、期望值和新值。当需要更新时,判断当前内存值是否等于先前获取的值,如果是,则用新值更新,如果失败,则重试。一般是旋转操作,即连续重试。
第二,悲观锁定
永远假设最坏的情况。每次取数据的时候,你都认为其他线程会修改它,所以你会加锁(读锁、写锁、行锁等。).当其他线程想要访问数据时,它们都需要阻塞和挂起。可以通过数据库来实现,比如行锁、读锁、写锁,这些都是在操作前锁定的。在Java中,synchronized的思想也是悲观锁。
三。适用场景
悲观锁:比较适合写操作频繁的场景。如果有大量的读操作,那么每次读的时候锁都会被锁住,这样会增加大量锁的开销,降低系统的吞吐量。
乐观锁定:适用于频繁读取操作的场景。如果有大量的写操作,数据冲突的可能性会增加。为了保证数据的一致性,应用层需要不断地重新获取数据,这会增加大量的查询操作,降低系统的吞吐量。
总结:两者各有利弊,比如频繁使用乐观锁读,悲观锁写。
推荐:java入门教程以上是java面试3354乐观锁和悲观锁的详细内容。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。