我有一个具有以下类级别变量的类:
private LinkedBlockingQueue<Integer> inputQueue;
private StringBuffer textBuffer;
private int currentIndex;
private String[] p;
private List<String[]> pageList;
private int cursor;
该类有一个方法setInput(),可以被多个线程访问。该方法像这样更改上述所有变量
public void setInput(String s) {
p[cursor] = input;
cursor++;
if (cursor == 1000) {
// UI logic
textBuffer.setLength(0);
p = new String[];
cursor = 0;
}
// Some other logic here
pageList.add(p);
currentIndex++;
if (!inputQueue.offer(currentIndex)) {
throw new RuntimeException();
}
}
这些变量可以由类中的其他代码片段读取,但它们只能在 setInput() 中修改。并且类中的所有其他方法都没有线程安全问题。换句话说,它们被确保由主线程调用。在这种情况下,如果我把sync关键字放在方法setInput()之前,那么我是否需要使用java.util.concurrent的LinkedBlockingQueue?同步方法时,这些变量是否保证线程安全?谢谢。
为了线程安全,所有访问字段(读取和写入)的方法都应该synchronized
不,在您的方案中,使setInput
方法synchronized
是不够的。所有访问变量的方法都需要同步,仅读取变量的方法也需要同步,否则变量可能会在执行时读取setInput
因此您可能会看到对象的不一致状态。
如果很多线程正在读取变量,但只有少数线程在写入它们,那么使读取方法也synchronized
可能是不必要的性能瓶颈。在这种情况下,最好使用 ReadWriteLock
,以便所有读取线程可以同时访问该对象。