相关疑难解决方法(0)

Java中的并发:同步静态方法

我想了解如何在Java中对静态方法进行锁定.

假设我有以下课程:

class Foo {
    private static int bar = 0;
    public static synchronized void inc() { bar++; }
    public synchronized int get() { return bar; }
Run Code Online (Sandbox Code Playgroud)

我的理解是,当我调用时f.get(),线程获取对象的锁定f,当我执行时Foo.inc(),线程获取类的锁定Foo.

我的问题是两个呼叫如何相互同步?调用静态方法也会获取所有实例化的锁定,或者相反(这似乎更合理)?


编辑:

我的问题并不完全是如何static synchronized工作的,但静态和非静态方法是如何相互同步的.也就是说,我不希望两个线程同时调用这两个f.get()Foo.inc(),但这些方法获得不同的锁.我的问题是这是如何可以预防的,并且在上面的代码中是否被阻止了.

java multithreading synchronized

9
推荐指数
2
解决办法
1万
查看次数

如果静态int线程在单个方法中递增,那么它是否安全?

我想跟踪getVariableAndLogAccess(RequestInfo requestInfo)使用下面的代码.如果只有这两个方法访问变量,它是否是线程安全的?使线程安全的标准方法是什么?

public class MyAccessLog(){

    private int recordIndex = 0;
    private int variableWithAccessTracking = 42; 
    private final Map<Integer, RequestInfo> requestsLog = new HashMap<>();
    public int getVariableAndLogAccess(RequestInfo requestInfo){
        Integer myID = recordIndex++;
        int variableValue = variableWithAccessTracking;
        requestInfo.saveValue(variableValue);
        requestLog.put(myID, requestInfo);
        return variableValue;
     }
     public void setValueAndLog(RequestInfo requestInfo, int newValue){
        Integer myID = recordIndex++;
        variableWithAccessTracking = variableValue;
        requestInfo.saveValue(variableValue);
        requestLog.put(myID, requestInfo);
     }

/*other methods*/
}
Run Code Online (Sandbox Code Playgroud)

java multithreading thread-safety

4
推荐指数
2
解决办法
236
查看次数