我想问一下 各位大神 那个发送下载进度给activity mfinished是单个线程的完成度吧 应该是传过去所有线程的已经下载的进度吧 不解啊 这里
2017-05-15
接上一条评论:
当第一个线程执行到行1,已进入if内,但还没有执行行2时,即sHelper依然为null,此时系统如果切换到第二个线程执行,第二个线程依然能进入if内,然后new一个并返回一个sHelper实例(假设内存地址为0x000012)。然后系统切换回线程1,继续在if内向下执行,此时它也会new一个实例(假设内存地址为0x000023)并返回。这样的话,各线程拿到的实例是不同的,在写数据库时依然会发生加锁情况。
给方法加同步,或用双重检测可解决,不了解的同学建议看看单例模式的七种写法(亦有说八种)及它们各自的优缺点。
当第一个线程执行到行1,已进入if内,但还没有执行行2时,即sHelper依然为null,此时系统如果切换到第二个线程执行,第二个线程依然能进入if内,然后new一个并返回一个sHelper实例(假设内存地址为0x000012)。然后系统切换回线程1,继续在if内向下执行,此时它也会new一个实例(假设内存地址为0x000023)并返回。这样的话,各线程拿到的实例是不同的,在写数据库时依然会发生加锁情况。
给方法加同步,或用双重检测可解决,不了解的同学建议看看单例模式的七种写法(亦有说八种)及它们各自的优缺点。
2017-05-07
提醒下后来的同学:
视频中的单例模式是不安全的,不能保证只产生单例。
if(sHelper==null){ // 行1
sHelper = new DatabaseHelper(context); //行2
}
return sHelper; // 行3
视频中的单例模式是不安全的,不能保证只产生单例。
if(sHelper==null){ // 行1
sHelper = new DatabaseHelper(context); //行2
}
return sHelper; // 行3
2017-05-07