java锁的种类以及辨析(一):自旋锁

简介:

作者:山鸡

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑。

1、自旋锁

自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区。如下


01 public class SpinLock {
02  
03   private AtomicReference<Thread> sign =new AtomicReference<>();
04  
05   public void lock(){
06     Thread current = Thread.currentThread();
07     while(!sign .compareAndSet(null, current)){
08     }
09   }
10  
11   public void unlock (){
12     Thread current = Thread.currentThread();
13     sign .compareAndSet(current, null);
14   }
15 }

使用了CAS原子操作,lock函数将owner设置为当前线程,并且预测原来的值为空。unlock函数将owner设置为null,并且预测值为当前线程。

当有第二个线程调用lock操作时由于owner值不为空,导致循环一直被执行,直至第一个线程调用unlock函数将owner设置为null,第二个线程才能进入临界区。

由于自旋锁只是将当前线程不停地执行循环体,不进行线程状态的改变,所以响应速度更快。但当线程数不停增加时,性能下降明显,因为每个线程都需要执行,占用CPU时间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁。

注:该例子为非公平锁,获得锁的先后顺序,不会按照进入lock的先后顺序进行。 

目录
相关文章
【Java中锁的分类】
【Java中锁的分类】
|
5月前
|
Java
synchronized关键字在Java中为多线程编程提供了一种简便的方式来管理并发,防止数据竞争和死锁等问题
Java的`synchronized`关键字确保多线程环境中的数据一致性,通过锁定代码段或方法防止并发冲突。它可修饰方法(整个方法为临界区)或代码块(指定对象锁)。例如,同步方法只允许一个线程执行,同步代码块则更灵活,可锁定特定对象。使用时需谨慎,以避免性能影响和死锁。
34 0
|
6月前
|
算法 安全 Java
您真的了解Java中的锁吗?这7种不同维度下的锁知道吗?
您真的了解Java中的锁吗?这7种不同维度下的锁知道吗?
42 2
|
6月前
|
安全 算法 Java
Java多线程基础-15:Java 中 synchronized 的优化操作 -- 锁升级、锁消除、锁粗化
`synchronized`在Java并发编程中具有以下特性:开始时是乐观锁,竞争激烈时转为悲观锁;从轻量级锁升级至重量级锁;常使用自旋锁策略;是不公平且可重入的;不支持读写锁。
52 0
|
6月前
|
Java 程序员 编译器
Java中的线程同步与锁优化策略
【4月更文挑战第14天】在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。Java提供了多种机制来实现线程同步,其中最常用的是synchronized关键字和Lock接口。本文将深入探讨Java中的线程同步问题,并分析如何通过锁优化策略提高程序性能。我们将首先介绍线程同步的基本概念,然后详细讨论synchronized和Lock的使用及优缺点,最后探讨一些锁优化技巧,如锁粗化、锁消除和读写锁等。
|
6月前
|
Java 调度
Java偏向锁
Java偏向锁
38 1
|
6月前
|
Java
高并发编程之JUC 三大辅助类和读写锁
高并发编程之JUC 三大辅助类和读写锁
51 1
|
缓存 安全 Java
解锁Java面试中的锁:深入了解不同类型的锁和它们的用途
多线程编程在现代软件开发中扮演着至关重要的角色。它使我们能够有效地利用多核处理器和提高应用程序的性能。然而,多线程编程也伴随着一系列挑战,其中最重要的之一就是处理共享资源的线程安全性。在这个领域,锁(Lock)是一个关键的概念,用于协调线程之间对共享资源的访问。本文将深入探讨Java中不同类型的锁以及它们的应用。我们将从基本概念开始,逐步深入,帮助您了解不同类型的锁以及如何选择合适的锁来解决多线程编程中的问题。
|
存储 安全 Java
难搞的偏向锁终于被 Java 移除了(上)
难搞的偏向锁终于被 Java 移除了(上)
难搞的偏向锁终于被 Java 移除了(上)