首页 > 编程知识 正文

java锁的类型,java 创建数组

时间:2023-05-05 00:14:06 阅读:129225 作者:184

一、自旋锁提交的背景

在多处理器系统环境中,由于资源的有限性,可能需要独占访问,在这种情况下,引入了锁定机制,只有获得锁定的过程才能获得资源访问。 也就是说,一次只有一个进程可以获取锁,进入自己的临界区域。 同一时间两个以上的进程不能进入临界区域。 离开临界区域时解除锁定。 在设计互斥算法时,没有获得锁的过程总是面临吗? 通常有两种处理方式。 一种是,没有获得锁定的呼叫方一直在那里循环,看旋转锁定的持有者是否释放了锁定。 这就是旋转锁,他不需要屏蔽郡(非屏蔽)。 另一种是未获得锁定的进程阻止自己,并向OS请求调度另一个线程的处理器。 这就是排他锁。

二.自旋锁定原理

与互斥锁一样,一个执行单元要访问受自旋锁保护的共享资源,必须首先获取锁定,访问共享资源,然后解锁。 获得旋转锁定后,如果没有保持锁定的执行单元,将立即锁定。 如果在获取旋转锁定时已经有锁定的所有者,则获取锁定操作将旋转到该旋转锁定的所有者解除锁定之前。 由此可见,自旋锁是保护相对低级别的数据结构或代码片段的原始方法,该锁可能存在两个问题。

递归死锁:试图递归获得自旋锁,一定会引起死锁。 递归程序的持有实例在第二个实例上循环,以便即使尝试获得相同的自旋锁也不会释放。 在递归程序中使用自旋锁时,必须遵循以下策略: 递归程序在保持旋转锁定的同时不要调用自己,也不要尝试在递归调用过程中获取相同的旋转锁定。 另外,如果一个流程已经锁定了资源,申请该资源的其他流程即使不断“旋转”,也无法获得资源,进入死循环。

过度消耗cpu资源。 如果不进行限制,申请人一直在等待循环,因此,在旋转锁定期间,如果不顺利,则不睡眠而继续尝试,在单cpu的情况下,旋转锁定会导致其他进程不工作。 因此,在一般的自旋锁的实现中,有限制最大尝试次数的参数。 如果超过,自旋锁将放弃现在的time slice .等待下一次机会

由此可见,旋转锁定适合于使用者保持较短的锁定时间。 由于自旋锁定使用者通常锁定时间非常短,因此需要选择自旋而不是睡眠,自旋锁定的效率远远高于互斥锁定。

三. Java CAS

CAS是系统原语(原语属于操作系统术语的范畴。 原语由几个指令构成,是用于发挥一定功能的过程。 优先级或自动操作是由若干机器指令组成的执行特定功能的程序,不可分割性(即原语的执行必须连续,不允许在执行中中断)。 CAS是比较和集的缩写。 CAS有三个操作数、存储值v、旧期望值a和要修改的新值b。 此外,仅当期望值a和存储器值v相同时,将存储器值v改变为b,否则不执行任何操作。

在x86平台上,CPU提供了一种在命令运行时锁定总线的方法。 CPU芯片有一个名为#HLOCK pin的引脚。 如果在汇编语言程序中在指令前加上前缀“LOCK”,则汇编后的机器代码会使CPU在执行该指令时降低#HLOCK pin的电位,并开放以锁定总线,直到该指令结束。 这将暂时阻止同一总线上的另一个CPU通过总线访问内存,并确保此指令大量存在

sun.misc.Unsafe是JDK的内部类,提供了大量低级内存操作和系统功能,从而保护了JDK的安全。 由于错误使用了这个类,所以不会抛出“异常”,JVM也可能出现故障。 所以这个班的名字是Unsafe。 因此,在使用这个班的时候,你必须明白你在做什么。 这个类提供了三个CAS操作

方法名称

解释

比较对象(对象,长地址,int expected,int newValue ) )。

在其他数据值为expected的情况下,比较对象的object的某个int型属性(通过地址访问)被设定为newValue,返回true; 否则返回false

比较对象(对象,长地址,长执行,长新值)。

比较对象的object的某个长型属性(通过地址访问),在他的数据值为expected的情况下,设定为newValue,返回true; 否则返回false

比较对象(对象new value )。

如果他的数据值是expected,则比较对象的object所在的object类型的属性(通过地址访问)被设定为newValue,返回true; 否则返回false

四. Java自旋锁应用-原子包

从Jdk1.5开始,提供了java.util.concurrent.atomic包。 此包包含一组原子类。 基本特性是,在多线程环境中,多个线程同时执行这些类的实例中包含的方法具有排他性。 这意味着,当一个线程进入方法并执行其中的指令时,不会被其他线程中断。 此外,其他线程在该方法执行之前不会执行JV,就像旋转锁定一样

M从等待队列中选择一个另一个线程进入,这只是一种逻辑上的理解。实际上是借助硬件的相关指令来实现的,不会阻塞线程(或者说只是在硬件级别上阻塞了)。其中的类可以分成4组

AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference

AtomicIntegerArray,AtomicLongArray

AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater

AtomicMarkableReference,AtomicStampedReference,AtomicReferenceArray

我们来看一段AtomicBoolean中的自旋锁的代码

public final boolean getAndSet(booleannewValue) {for(;;) {boolean current =get();if(compareAndSet(current, newValue))returncurrent;

}

}

参考

http://baike.baidu.com/view/1250961.htm?fr=aladdin

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。