这篇文章给大家分享的是有关java中各类锁的机制是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。总结java常见的锁区分各个锁机制以及如何使用悲观锁:不能同时进行多人,执行的时候先上锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁乐观锁:通过版本号一致与否,即给数据加上版本,同步更新数据以及加上版本号。不会上锁,判断版本号,可以多人操作,类似生活中的抢票。每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的(乐观锁可以使用版本号机制和CAS算法实现)通过具体案例演示悲观锁和乐观锁在redis框架中执行multi之前,执行命令watch具体格式如下具体代码格式如下flushdb是清空数据库但如果在另一个服务器上,输入exec,会显示出错因为用的是乐观锁,被修改了之后版本会发生改变总的来说:悲观锁:单独每个人完成事情的时候,执行上锁解锁。解决并发中的问题,不支持并发操作,只能一个一个操作,效率低乐观锁:每执行一件事情,都会比较数据版本号,谁先提交,谁先提交版本号公平锁:先来先到非公平锁:不是按照顺序,可插队公平锁:效率相对低非公平锁:效率高,但是线程容易饿死通过这个函数Lock lock = new ReentrantLock(true);。创建一个可重入锁,true 表示公平锁,false 表示非公平锁。默认非公平锁通过查看源码带有参数的ReentrantLock(true)为公平锁ReentrantLock(false)为非公平锁主要是调用NonfairSync()与FairSync()具体其非公平锁与公平锁的源码查看公平锁的源码通过代码实例具体操作结果截图如下都是A线程执行,而BC线程都没执行到,出现了非公平锁具体改变其设置可以通过可重入锁中的一个有参构造方法修改代码为private final ReentrantLock lock = new ReentrantLock(true);代码截图为可重入锁也叫递归锁而且有了可重入锁之后,破解第一把之后就可以一直进入到内层结构synchronized (o)代表锁住当前{ }内的代码块以上都是synchronized锁机制下面讲解lock锁机制在同一把锁中的嵌套锁,内部嵌套锁没解锁还是可以输出,但是如果跳出该线程,执行另外一个线程就会造成死锁要把握上锁与解锁的概念,都要写上读锁是共享锁,写锁是独占锁共享锁的一种具体实现读写锁管理一组锁,一个是只读的锁,一个是写锁。读写锁:一个资源可以被多个读线程访问,也可以被一个写线程访问,但不能同时存在读写线程,读写互斥,读读共享(写锁独占,读锁共享,写锁优先级高于读锁)读写锁ReentrantReadWriteLock读锁为ReentrantReadWriteLock.ReadLock,readLock()方法写锁为ReentrantReadWriteLock.WriteLock,writeLock()方法创建读写锁对象private ReadWriteLock rwLock = new ReentrantReadWriteLock();写锁 加锁 rwLock.writeLock().lock();,解锁为rwLock.writeLock().unlock();读锁 加锁rwLock.readLock().lock();,解锁为rwLock.readLock().unlock();案例分析:模拟多线程在map中取数据和读数据完整代码如下5. 互斥锁互斥锁是独占锁的一种常规实现,是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性查看百度百科的解释,具体如下 :它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看免费云主机域名是否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名通俗的来说就是一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务。其特点:持有锁时间等待过长,消耗CPU无法满足等待时间最长的线程优先获取锁。不公平的锁就会存在“线程饥饿”问题自旋锁不会使线程状态发生切换,处于用户态(不会到内核态进行线程的状态转换),一直都是活跃,不会使线程进入阻塞状态,减少了不必要的上下文切换,执行速度快。其模拟算法如下无锁:没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功偏向锁:是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价轻量级锁:锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能重量级锁:线程并发加剧,线程的自旋超过了一定次数,或者一个线程持有锁,一个线程在自旋,还有线程要访问感谢各位的阅读!关于“java中各类锁的机制是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
这篇文章主要讲解了“Python虚拟环境解决不兼容怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,免费云主机域名一起来研究和学习“Python虚拟环境解决不兼容怎么解决”吧!采用Python 虚拟环境,解决python不同…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。