【技巧】无指定对象时对同步代码块加锁时对象选择

文章讨论了在Java中使用零长度的byte数组作为同步锁的原因,因为这种做法在创建时相比其他对象具有更高的效率,编译后字节码只需3条操作码,而创建一个新Object需要7条。这种方式是性能优化的一种策略。
摘要由CSDN通过智能技术生成

使用特殊的实例变量 长度为0的byte数组

private byte [] lock = new byte[0];//特殊的instance变量
private void method(){
    synchronized(lock){
        //同步代码块
    }
}

原因:

零长度的byte数组对象创建比创建别的对象都更经济;在查看编译后的字节码,发现零长度的byte数组对象只需要3条操作码,而创建一个Object lock = new Object(),需要7行操作码

在 Java 中,synchronized 关键字可以用于不同的锁对象,包括 this 对象、类对象和成员对象。 1. 对于 this 对象加锁 当使用 synchronized(this) ,锁对象是当前实例对象,即该实例的所有 synchronized 方法和 synchronized 代码块都会相互竞争同一把锁。这样的锁定范围是对象级别的,不同实例对象之间的锁是互不影响的。 下面是一个使用 synchronized(this) 的代码示例: ``` public class MyClass { public synchronized void synchronizedMethod() { // 代码块1 } public void nonSynchronizedMethod() { // 代码块2 synchronized (this) { // 代码块3 } } } ``` 在上述代码中,synchronizedMethod() 方法和 synchronized (this) 代码块都是锁定当前实例对象,即 MyClass 的实例对象。而 nonSynchronizedMethod() 方法中的 synchronized (this) 代码块也是锁定当前实例对象。 2. 对于类对象加锁 当使用 synchronized(MyClass.class) ,锁对象是 MyClass 类对象,即该类的所有实例对象都会相互竞争同一把锁。这样的锁定范围是类级别的,所有实例对象之间的锁是相互影响的。 下面是一个使用 synchronized(MyClass.class) 的代码示例: ``` public class MyClass { public static synchronized void synchronizedMethod() { // 代码块1 } public void nonSynchronizedMethod() { // 代码块2 synchronized (MyClass.class) { // 代码块3 } } } ``` 在上述代码中,synchronizedMethod() 方法和 synchronized (MyClass.class) 代码块都是锁定 MyClass 类对象。而 nonSynchronizedMethod() 方法中的 synchronized (MyClass.class) 代码块也是锁定 MyClass 类对象。 3. 对于成员对象加锁 当使用 synchronized(memberField) ,锁对象是成员对象,即该成员变量的所有实例对象都会相互竞争同一把锁。这样的锁定范围是成员对象级别的,不同实例对象之间的锁是互不影响的。 下面是一个使用 synchronized(memberField) 的代码示例: ``` public class MyClass { private final Object lock = new Object(); public synchronized void synchronizedMethod() { // 代码块1 } public void nonSynchronizedMethod() { // 代码块2 synchronized (lock) { // 代码块3 } } } ``` 在上述代码中,synchronizedMethod() 方法是锁定当前实例对象,而 synchronized (lock) 代码块则是锁定成员变量 lock。这里的 lock 可以是任意对象,只要保证所有实例对象共用同一把锁即可。 总的来说,使用 synchronized 关键字可以实现多线程的同步,不同的锁对象可以锁定不同的范围,根据实际需要选择合适的锁对象,有助于提高并发性能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值