java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
答案2023-06-21:
java的:
这个问题,我问了一些人,部分人是回答得有问题的。synchronized这是个关键字,加锁和解锁不是直接用代码实现,所以在代码层面上就杜绝了加锁和解锁不在同一个线程得情况。可以这么说,synchronized是无法实现同一把锁的加锁和解锁在不同线程。
ReentrantLock的加锁和解锁,是在代码层面实现的,所以是可以写出这样的代码,如下:
package com.hikvision;
import java.util.concurrent.locks.ReentrantLock;
public class Application {
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
// 线程1加锁
Thread thread1 = new Thread(() -> {
lock.lock();
try {
System.out.println("Thread 1 lock.");
} finally {
lock.unlock();
}
});
// 线程2解锁
Thread thread2 = new Thread(() -> {
lock.unlock();
System.out.println("Thread 2 unlock.");
});
thread1.start();
try {
Thread.sleep(1000); // 等待1秒,确保线程1先执行
} catch (InterruptedException e) {
e.printStackTrace();
}
thread2.start();
try {
Thread.sleep(1000); // 等待1秒,确保线程2先执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果如下:
根据运行结果可以看出,ReentrantLock的加锁和解锁在代码层面上可以实现,但是运行会报异常。说明ReentrantLock不支持同一把锁的加锁和解锁能在不同线程。
综上所述:java中synchronized和ReentrantLock的加锁和解锁不能在不同线程。
go的:
go的sync.Mutex的加锁和解锁能在不同协程吗?如果能,如何实现?
sync.Mutex的加锁和解锁,是在代码层面实现的,所以是可以写出这样的代码,如下:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// 加锁和解锁可以不在同一个协程
var m sync.Mutex
m.Lock()
fmt.Println("加锁成功")
go func() {
time.Sleep(time.Second * 5)
m.Unlock()
fmt.Println("解锁成功")
}()
time.Sleep(time.Hour)
}
根据运行结果可以看出,sync.Mutex的加锁和解锁在代码层面上可以实现,运行也正常。说明sync.Mutex支持同一把锁的加锁和解锁能在不同协程。
综上所述:go中sync.Mutex的加锁和解锁能在不同线程。
总结:
java中synchronized和ReentrantLock都是可重入锁,所以在线程上的加锁和解锁会做限制,加锁和解锁必须在同一线程,并且成对出现。
go的sync.Mutex是不可重入锁,所以在协程上的加锁和解锁没做限制。加锁和解锁可以不在同一协程,但要成对出现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
2022-06-21 golang调用sdl2,播放pcm音频,报错signal arrived during external code execution。
2022-06-21 2022-06-21:golang选择题,以下golang代码输出什么?A:3;B:4;C:100;D:编译失败。 package main import ( “fmt“ ) func
2021-06-21 2021-06-21:贩卖机只支持硬币支付,且收退都只支持10 ,50,100三种面额。一次购买只能出一瓶可乐,且投钱和找零都遵循优先使用大钱的原则,需要购买的可乐数量是m, 其中手头拥有的10、50