【发布时间】:2016-11-22 20:26:05
【问题描述】:
我试图理解这个 android 实现,但我就是不明白为什么静态字段 lockStatic 是 volatile,因为它的使用只能通过 getLock 方法并且它是一个同步块,所以应该没有并发或对象发布问题。
abstract public class WakefulIntentService extends IntentService {
abstract protected void doWakefulWork(Intent intent);
static final String NAME=
"com.commonsware.cwac.wakeful.WakefulIntentService";
static final String LAST_ALARM="lastAlarm";
private static volatile PowerManager.WakeLock lockStatic=null;
synchronized private static PowerManager.WakeLock getLock(Context context) {
if (lockStatic == null) {
PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
lockStatic=mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, NAME);
lockStatic.setReferenceCounted(true);
}
return(lockStatic);
}
如果允许 lockStatic 以任何其他方式访问,我认为只有 volatile 需要,但它的私有且唯一处理它的方法是 getLock 方法。这只是一个断言还是背后有其他原因?
提前感谢您为解决此问题提供的任何帮助。
【问题讨论】:
-
我很确定我这样做是为了支持双重检查锁定实现。然而,一般来说,问“为什么开发人员 X 做 Y 事?”对于堆栈溢出来说不是很好。唯一能明确回答的人是开发者 X。在这种情况下,我是开发者 X,并且我在几年前编写了该代码。没有其他人可以明确回答。
-
@CommonsWare 不过,当主要框架代码的作者出现解释时,这还算不错。
标签: java android multithreading