gpt4 book ai didi

java - 线程同步说明

转载 作者:行者123 更新时间:2023-12-01 23:40:32 25 4
gpt4 key购买 nike

只是想确定我理解锁定

public class MySync {
public static synchronized byte[] getRes(String str1, String str2) throws Exception {
...
return new byte[myLen];
}
//no other methods
}
public class MyClass extends MyClass2 {
public MyStuff getStuff (SomeObj obj) {
byte[] res = MySync.getRes(s1,s2);
...
}
...
}

线程 1 调用 MyClass
线程2调用MyClass
线程3调用MyClass
T1 调用 getres。
T2 等待 T1 完成其对 MySync 类的锁定
T3 等待 T1 完成对 MySync 类的锁定
T1 结束
T3 调用 getres(即顺序是否保留?)
T2等待T3完成
T3航站楼竣工
T2 调用 getres

是吗?

getRes 现在是“瓶颈”;线程需要在“队列”中等待?
请注意,我确实希望将其用于我的应用程序。每个操作仅允许一个线程。

下面的代码将实现与上面相同的效果,除了锁位于 myLock 类上?
这是首选,为什么?

public class MySync {
private static final Object myLock = new Object();
public byte[] getRes(String str1, String str2) throws Exception {
synchronized (myLock) {
...
return new byte[myLen];
}

public class MyClass extends MyClass2 {
public MyStuff getStuff (SomeObj obj) {
byte[] res = new MySync().getRes(s1,s2);
...
}

最佳答案

如果出现

public static synchronized byte[] getRes(String str1, String str2)

隐式锁将是class实例,即MySync.class(因为它是静态同步方法)。所以是的,你是对的,它相互排斥

如果出现

public class MySync {
private static final Object myLock = new Object();
public byte[] getRes(String str1, String str2) throws Exception {
synchronized (myLock) {

结果是相同的,因为您的锁 myLock静态,并且它在 MySync 的多个实例中共享> 类

以下方法是首选方法,因为 MySync.class 对象不会有线程锁定/解锁的开销,而是有一个专用的 myLock 对象

正如@BoristheSpider 的评论中提到的,Lock objects Java5 引入的锁为程序员在管理方法/ block 上的锁方面提供了更大的灵 active ,并且也更具可读性。

关于java - 线程同步说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18019049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com