运维开发网

Java对象级和类级同步锁的同步语法演示示例

运维开发网 https://www.qedev.com 2022-10-03 14:14 出处:网络
这篇文章主要为大家介绍了Java对象级别与类级别的同步锁synchronized语法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

这篇文章主要为大家介绍了Java对象级别与类级别的同步锁synchronized语法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步


Java synchronized关键字可以将代码块或方法标记为同步代码块。同步代码块是指一次只能由一个线程执行的代码,执行该代码的线程持有同步锁。同步关键字可以作用于

一个代码块一种方法

当一个方法或代码块被声明为synchronized时,如果一个线程正在执行synchronized方法或代码块,其他线程将被阻塞,直到持有同步锁的线程被释放。根据锁定的范围,它可以分为

类级别的锁可以防止多个线程在运行时同时进入该类所有实例化对象的 synchronized代码块中。对象级别的锁可以防止多个线程在运行时同时进入当前(或某一个)实例化对象的 synchronized代码块中。


1. 对象级别的同步锁

对象级同步锁:当我们要在多线程环境中同步执行一个非静态方法或者非静态代码块时,在一个类的方法或者代码块中加入synchronized关键字,可以保证对象实例级数据的线程安全。(后面对比一下类级同步锁,后面理解这句话。)

锁定对象级的代码如下,比如:锁定方法,锁定的对象是当前类的实例化对象。

public class DemoClass{public synchronized void demoMethod(){}}

比如锁定一个代码块,锁定的对象就是这个对象

public class DemoClass{public void demoMethod(){synchronized (this){//同步代码块}}}

比如锁定一个代码块,锁定的对象是我们创建的任何对象。不要使用非fffinalalal成员变量作为同步锁对象,因为非final成员变量可以被重新分配,导致不同的线程使用不同的对象作为锁,无法达到同步锁的效果。

public class DemoClass{ //注意这里的关键字final非常重要,看说明private final Object lock = new Object();public void demoMethod(){synchronized (lock){//同步代码块}}}


2. 类级别的同步锁

类级锁可以防止多个线程进入quot运行时类的所有实例化对象的。在同步块中。也就是说,如果运行时有100个DemoClass实例,那么在任何一个实例中,一次只能有一个线程执行demoMethod(),其他所有实例的所有线程都被锁定。

为了保证静态数据线的安全性,应该使用类级锁。我们知道static关键字将方法的数据与类的级别相关联,所以我们在静态方法上使用锁。

静态方法锁定对该类的所有实例化对象都有效。

public class DemoClass{//静态方法加锁,对该类所有的实例化对象生效public synchronized static void demoMethod(){}}

获取对。类class,类级别的锁。

public class DemoClass{public void demoMethod(){//获取 .class类的引用,类级别的锁,对该类所有的实例化对象生效synchronized (DemoClass.class){//同步代码块}}}

使用静态对象锁、类级锁

public class DemoClass{ //静态对象,类级别,注意这里的关键字final非常重要private final static Object lock = new Object();public void demoMethod(){//使用静态对象的锁,类级别锁,对该类所有的实例化对象生效synchronized (lock){//同步代码块}}}


3. 总结Java中的同步机制保证了两个或多个线程无法同时执行一个需要相同同步锁的方法。quot;synchronized quot;关键字只能用于方法和代码块。这些方法或代码块可以是静态或非静态的。当一个线程进入synchronized方法或代码块时,它就会获得一个锁,当它离开同步方法或代码块时,它就会释放这个锁。如果线程执行过程出现任何错误或异常,锁也会被释放。使用quot;synchronized quot;关键字持有的锁在本质上是可重入的,这意味着如果一个同步方法调用另一个使用相同锁的同步方法,那么持有锁的当前线程可以进入该方法而无需再次获得锁。如果同步块中使用的对象为空,Java synchronized 将抛出NullPointerException使用synchronized同步方法会给你的应用程序带来性能成本。因此,尽量在绝对需要的情况下才使用同步。另外优先考虑使用同步代码块,并且只同步代码的关键部分。静态同步方法和非静态同步方法有可能同时或并发运行,因为它们使用的是不同的锁。根据Java语言规范,你不能在构造函数中使用synchronized关键字。这是不合法的,会导致编译错误。不要使用非final的成员变量作为同步锁对象,因为非final成员变量可以被重新赋值,导致不同的线程使用不同的对象作为锁,达不到同步锁定的效果。不要使用字符串字面量作为锁对象,如:String a = quot;1quot;;,因为它们可能会被应用程序中的其他地方引用,并可能导致死锁。用new关键字创建的字符串对象可以安全使用。

这就是Java对象级和类级同步锁的同步语法示例的细节。更多关于synchronized Java对象级和类级同步锁的信息

0

精彩评论

暂无评论...
验证码 换一张
取 消