如何在Java中同步对类字段的访问?

时间:2014-04-10 21:49:59

标签: java multithreading

类中有一个变量,它被多个线程主动使用。例如:

public class A {
    private int magicVar;

    private void someMethod() {
        // some operations with magicVar
    }

    public synchronized void somePublicMethod() {
        // some operations with magicVar
    }

    private class B extends Thread {

        @Override
        private void run() {
            // some operations with magicVar
        }

    }
}

在这种情况下如何组织对变量的访问?描述私有同步setter和getter?或者将此字段标记为违反?

2 个答案:

答案 0 :(得分:1)

这完全取决于你打算如何使用你的课程。同步不是实现细节,它是设计的一部分。

在保护对整数的访问时,请考虑使用AtomicInteger

答案 1 :(得分:0)

使字段变为volatile将确保线程的可见性,但是如果您正在进行

之类的操作
a = a + 2;

这是一个复合操作,而不是原子操作。要使所有线程都可以看到对您的字段的最新更改并执行原子操作,您可以将someMethod()和somePublicMetod()标记为同步。

要么具有锁定对象的更精细的同步块

Object lock = new Object(); // make this an instance variable
// ...
// then each time  you need to make operations with your contended field you can do 
synchronized(lock) {
    // make changes to your contended field
}