你基本上有一个读者作家的问题,有两个读者和(目前)只有一个作家.如果你只想在线程之间传递简单类型,那么AtomicInteger或类似实现的AtomicFloat就可以了.
但是,一个更容易使用的解决方案,可以让您使用更复杂的数据类型,ReadWriteLock保护您读取或写入对象数据的代码:
例如.:
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); //the reentrant impl
....
public void readMethod() {
readWriteLock.readLock().lock();
try {
//code that simply _reads_ your object
} finally {
readWriteLock.readLock().unlock();
}
}
public void writeMethod() {
readWriteLock.writeLock().lock();
try {
//... code that modifies your shared object / objects
} finally {
readWriteLock.writeLock().unlock();
}
}
这将仅启用“仅一个编写器”或“多个读取器”方案来访问您的共享对象.
这将使您能够使用如下所示的复杂类型:
public class SensorRead {
public java.util.Date dateTimeForSample;
public float value;
}
使用此数据类型时,您应该关心是否安全且原子地设置和修改了两个字段. AtomicXXX类型对象不再有用.