Java中的锁的概念挺多,从思想的角度,分为通过各种锁。下面可以让我们来分别进行认识了解一下对于他们(虚拟主机)。
我们一般用的都是可重入锁。可重入锁定装置,当一个线程获取锁,如果重新获得锁,它仍然可以得到。
而不可重入锁,指的是当一个线程获取到自己一个锁后,如果再次进行获取社会这个锁的话,就不能再获取到了。不可重入锁会导致死锁,所以需要我们国家一般是不会通过使用过程中不可重入锁的。
公平锁、非公平锁
AQS框架可以实现公平锁和非公平锁。 AQS框架包含三个主要元素,一个是状态状态,用来表示锁是否被占用,另一个是当前线程,最后一个是保存被阻塞线程的队列。
如果用于保存被阻塞线程的队列按顺序获取锁,并且队列的第一个线程首先获取锁,那么这是一个公平的锁,每个线程可以按照它进入队列的顺序获取锁。
如果一个线程被阻塞,以节省排队不是为了得到一个锁,但大家争相锁,这个锁是不公平的,这可能会导致某些线程都不能获得锁被饿死。
悲观锁,乐观锁,自旋锁
悲观锁和乐观锁也是作为一种具有不同文化维度的锁的思想。
悲观锁指的是在执行操作之前进行锁定,以确保只有获得锁的线程才能执行。 在这种情况下,由于锁定操作,效率可能较低,但确保安全。 像synchronized和Reentrant Lock一样是悲观锁。
乐观锁不是在执行前锁定,而是在执行时判断,如 cas 是典型的乐观锁。在执行时,将线程工作内存与最新数据进行比较,如果是更新前的最新数据,如果不是最新数据,则工作线程内存中的数据已过期,则开发人员将处理该数据。
提到CAS,可能会觉得自旋锁的。轻量级锁不同步CAS是使用自旋锁模式么。在这里,我们有很好的概念,CAS和旋转来区分。 CAS是一个比较和交换,也就是,比较和交流。这是一个操作,比较和交换操作。自旋是指执行相同的操作多次。他们是两个不同的概念。指自旋锁自旋的方式与CAS操作进行数次。因此,CAS是乐观锁,并多次CAS,也就是乐观锁的实施,就变成了自旋锁倍。
独占锁、共享锁
独占锁、共享锁也是一个思想进行成本的概念。
只有一个线程能够拥有该锁独占锁装置以执行相应的操作。例如:同步和的ReentrantLock,以及写锁定读写锁。
共享锁指的是企业可以有多个线程同时我们拥有自己这个锁。比如:读写锁中的读锁,是允许使用多个线程一同获取到的。还有Semaphore(信号量),因为他们允许存在多个线程需要通过,所以发展也是一个共享锁。
总结
这么多锁的概念是从不同维度对锁进行分类。 这些都是概念性的东西,可以用不同的方式实现。
这些锁本质上是一个框架,其功能是允许一个或多个线程在正确的时间执行,而另一个或其他线程阻塞。Java 并发库中的锁,哪个线程要执行,哪个线程要阻塞,由基于共享变量和锁支持的 aqs 确定。
是的,锁被用来控制一个线程被阻塞框架和实施。