如何使类线程安全?

时间:2020-07-03 06:37:57

标签: java multithreading concurrency thread-safety

如何使以下Java类线程安全?

class Test {

    int size;
    int index;
    String[] a;


    Test() {
        a = new String[10];
        size = 10;
    }


    Test(int b) {
        a = new String[b];
        size = b;
    }


    public int getSize() {
        return size;
    }


    public void addElement(String s) {
        if (a.length < size) {
            a[index] = s;
            index++;
        } else {
            // ...
        }
    }


    public String getElement(int i) {
        if (i < index) {
            return a[i - 1];
        } else {
            return 0;
        }
    }
}
  1. 是否足以使String[] a;变量volatile
  2. 还是我需要使用synchronized关键字?

我的假设是方法synchronizedgetSize()不需要getElement()。正确吗?

1 个答案:

答案 0 :(得分:2)

要回答您的问题:

  1. 易失性是一种数据完整性机制。基本上,您是在告诉编译器变量可能会因在另一个线程中执行的代码而改变,因此它应始终从内存而不是从缓存中获取。

  2. isset($_POST['price'])是您的最佳选择。对于同步阵列,您需要保护的是写操作,因为它们将修改阵列的内容。此外,如注释中所指出的那样,将0关键字添加到synchronized方法将确保它在任何并发synchronized调用之后都将被执行,因此它将始终使用最新的元素在数组中。 Synchronized Methods上的官方文档有更多详细信息。

    getElement