相关疑难解决方法(0)

Java synchronized块与Collections.synchronizedMap

以下代码是否设置为正确同步呼叫synchronizedMap

public class MyClass {
  private static Map<String, List<String>> synchronizedMap = Collections.synchronizedMap(new HashMap<String, List<String>>());

  public void doWork(String key) {
    List<String> values = null;
    while ((values = synchronizedMap.remove(key)) != null) {
      //do something with values
    }
  }

  public static void addToMap(String key, String value) {
    synchronized (synchronizedMap) {
      if (synchronizedMap.containsKey(key)) {
        synchronizedMap.get(key).add(value);
      }
      else {
        List<String> valuesList = new ArrayList<String>();
        valuesList.add(value);
        synchronizedMap.put(key, valuesList);
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我需要同步块addToMap()来防止另一个线程调用remove()containsKey()在我通过调用之前put()但我不需要同步块doWork()因为另一个线程无法addToMap() …

java synchronization

81
推荐指数
4
解决办法
11万
查看次数

一个实例中的Java两个同步方法

考虑以下代码:

public class SynchronizedCounter extends Thread {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public void run() {
        for(;;)
            increment();
    }
}

static void main(String[] args) {
    SynchronizedCounter counter = new SynchronizedCounter();
    counter.start();
    for(;;)
        counter.decrement();
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着increment()decrement()方法将等待彼此完成或不完成?

编辑: 这不等了吗?

static void main(String[] args) {
    SynchronizedCounter counter1 = new SynchronizedCounter();
    SynchronizedCounter counter2 = new SynchronizedCounter();
    counter1.start();
    for(;;)
        counter2.decrement();
}
Run Code Online (Sandbox Code Playgroud)

java multithreading synchronization

12
推荐指数
2
解决办法
5757
查看次数

Java中的多个对象锁?

锁定私有字段变量(而不是使用锁定对象)是安全/可接受的做法吗?这样,我可以有不同的锁用于不同的目的.示例如下:

class Test {
  private Integer x = 0;
  private Integer y = 0;

  public void incrementX() {
    synchronized(x) {
      x++;
    }
  }

  public void decrementX() {
    synchronized(x) {
      x++;
    }
  }

  public void incrementY() {
    synchronized(y) {
      y++;
    }
  }

  public void decrementY() {
    synchronized(y) {
      y++;
    }
  }
Run Code Online (Sandbox Code Playgroud)

或者我应该为每个想要锁定的私人会员拥有一个锁定对象?例:

class Test {
  private final Object xLock = new Object();
  private final Object yLock = new Object();
  private Integer x = 0;
  private Integer y = 0;

...

} …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading locking synchronized

3
推荐指数
2
解决办法
3074
查看次数