
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程开发语言是目前大多数软件开发程序员在开发软件的时候都会用到的一种编程语言,而本文我们就通过案例分析来简单了解一下,Java编程语言锁的常见类型都有哪些。
1、公平锁与非公平锁
根据线程获取锁的机制,锁可以分为公平锁和非公平锁,公平锁表示线程获取锁的顺序是按照线程请求锁的时间早晚来决定的,也就是早请求锁的线程获取到锁,而非公平锁在运行时闯入,也就是先来不一定先得。
假如线程A已经持有了锁,这时候线程B请求该锁会被挂起。当线程A释放锁后,假如当前也有线程C也需要获取到该锁,如果采用非公平锁方式,则根据线程调度策略,线程B和线程C两者之一可能获得该锁,这时候不需要任何其他干涉。而如果采用公平锁,则需要把C线程挂起,让线程B获取到该锁。在没有公平性需求的情况下尽量使用非公平锁,因为公平锁会带来性能消耗。
2、独占锁与共享锁
根据锁只能被单个线程持有还是多个线程共享哎,可以将锁分为独占锁和共享锁。
独占锁保证任何时候都只有一个线程得到锁,ReenTrantLock就是以独占的方式实现的,共享锁则可以同时由多个线程持有,,例如ReadWriteLock读写锁,它允许一个资源可以同时被多个线程进行读操作。
独占锁是一种悲观锁,由于每次访问资源都需要先加上互斥锁,这限制了并发性,因为读操作并不会影响数据的一致性,而独占锁只允许同一时间只能允许同一个线程读取数据,其他线程必须等待当前线程释放锁后才能释放。共享锁是一种乐观锁,它放松了加锁的条件,允许多个线程同时进行读操作。
3、可重入锁
当一个线程要获取一个被其他线程持有的独占锁时,该线程会被阻塞,那么当一个线程再次获取它自己已经获取的锁时是否会被阻塞呢?如果不阻塞,那么我们说该锁是可重入的,也就是只要线程获取到了该锁,那么可以无限次数(在以后的文章中我们将知道严格来说是有限次)地进入被该锁锁住的代码。
4、自旋锁
由于Java中的线程与操作系统中的线程一一对应,所以当一个线程获取锁失败后,会被切换到内核状态而挂起。当该线程获取到锁的时候有需要将其切换到内核状态而唤醒该线程,而从用户状态切换到内核状态开销是比较大的,在一定程度上会影响并发性能。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。