在安卓开发,多线程并不多,更多时候在于三种线程,UI线程,数据库写线程,网络线程。三种线程也很少并发同时工作。所以读写保护之类也不是特别重要和显眼。可能更多的是耗时线程与UI线程使用Handler通信机制。
然而由于现在需要维护一份安卓多线程下载代码模块,下载是常见的多线程并发读写加断点续传,里面是写的一个下载模块,各种网络原因和弱网环境加特殊通道等等。让这份代码现有能力无法弄明白,所以打算看《java并发编程实战》,重新理解多线程并发和常见锁管理。
例子:
非常经典的一个例子:
public class DownloadEntity {
int count;
public int get(){
return count++;
}
}
public class Down extends Thread{
static DownloadEntity downloadEntity=new DownloadEntity();
public static void main(String args[])
{
for(int i=0;i<100;i++) {
Down down=new Down();
down.start();
}
Down.print();
}
public void run()
{
downloadEntity.get();
}
public static void print()
{
System.out.print(downloadEntity.get());
}
}
这是几乎所有多线程读写的例子,重新温习一下这段代码。
当只有一个线程也就是串行的时候,发现代码是顺序执行的。
那么读写也就是顺序的时候,一切很正常。
这段代码多线程并发,执行100次,100次的count++操作和读操作。
由于get()方法中无法保证一个线程原子操作,所以线程不安全,也就
是多线程程序本身有问题。
总结:count++非原子操作。细分是读count ,count+1,写count三个部分。
多线程注意并发访问是否一致性问题。也就是一份数据被多线程共享,那么
需要考虑如何管理同一时刻安全地访问数据,这里安全指的是数据正确。
上面代码可以改成
public synchronized int get(){
return count++;
}
由于每一次访问都是加锁的,所以第一个线程处理完,第二个线程才可以处理。