课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习软件编程开发技术,而java编程由于应用范围广而深受众人的喜欢,下面我们就一起来了解一下java编程中常见的几种锁的类型。
一、Java锁分类
Java中的锁有很多,可以按照不同的功能、种类进行分类,下面是我对Java中一些常用锁的分类,包括一些基本的概述
从线程是否需要对资源加锁可以分为悲观锁和乐观锁;
从资源已被锁定,线程是否阻塞可以分为自旋锁;
从多个线程并发访问资源,也就是Synchronized可以分为无锁、偏向锁、轻量级锁和重量级锁;
从锁的公平性进行区分,可以分为公平锁和非公平锁;
从根据锁是否重复获取可以分为可重入锁和不可重入锁;
从那个多个线程能否获取同一把锁分为共享锁和排他锁。
二、线程是否需要对资源加锁
Java按照是否对资源加锁分为乐观锁和悲观锁,乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想,乐观锁和悲观锁对于理解Java多线程和数据库来说至关重要,下面就来探讨一下这两种实现方式的区别和优缺点。
1、悲观锁
悲观锁是一种悲观思想,它总认为坏的情况可能会出现,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候总会把资源或者数据锁住,这样其他线程想要请求这个资源的时候就会阻塞,直到等到悲观锁把资源释放为止。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。悲观锁的实现往往依靠数据库本身的锁功能实现。
2、乐观锁
乐观锁的思想与悲观锁的思想相反,它总认为资源和数据不会被别人所修改,所以读取不会上锁,但是乐观锁在进行写入操作的时候会判断当前数据是否被修改过(具体如何判断我们下面再说)。乐观锁的实现方案一般来说有两种:版本号机制和CAS实现。乐观锁多适用于多度的应用类型,这样可以提高吞吐量。
三、资源已被锁定,线程是否阻塞
由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutualexclusion),这时候就需要引入锁的概念,只有获取了锁的线程才能够对资源进行访问,由于多线程的核心是CPU的时间分片,所以同一时刻只能有一个线程获取到锁。那么就面临一个问题,那么没有获取到锁的线程应该怎么办?
通常有两种处理方式:一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁叫做自旋锁,它不用将线程阻塞起来(NON-BLOCKING);还有一种处理方式就是把自己阻塞起来,等待重新调度请求,这种叫做互斥锁。
1、什么是自旋锁
自旋锁的定义:当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。这种采用循环加锁->等待的机制被称为自旋锁(spinlock)。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!