重学多线程开发,学习并发思路

在安卓开发,多线程并不多,更多时候在于三种线程,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++;
    }

由于每一次访问都是加锁的,所以第一个线程处理完,第二个线程才可以处理。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值