多线程

多线程
多线程,双叫并发,

1、多线程比单线程快吗

大一般情况下,多线程是比单线程快的。但不是一定
在单核cpu的情况下,如果做的工作是cpu密集型的,开多个线程,反而有可能比线程要慢,线程间的切换是需要消耗资源和时间的。
但是,大部分情况下,我们做的工作是IO密集型的,消耗的大部资源在IO上,因此CPU还是处于空闲状态,这时候,利用多线程,可以充分的利用资源
举个例子:
用挖掘机来挖土,如果用10辆的话,可能要比1辆快10倍,但是如果空间有限,只能容下一台挖掘机,那么如果用10辆来轮流挖,倒没有用一辆挖的快

2、synchronized同步锁

效率和安全往往需要取舍的。synchronized必定会影响程序的性能。在使用多线程时,可能会访问一些全局的数据,这时必然会使用同步机制来使程序按照一定顺序来执行,这样程序的性能也会下降。所以一定要慎用同步,正确使用同步。

3、如果在多线程中使用了synchronized,那么效率是否和单线程一样呢?

多线程中使用synchronized,使在同一时刻,只能有一个线程来访问该方法。即使在这种情况下,效率还是要比单线程要快的多的。
再比如排队买票,有很多窗口等于开了很多线程,但对于卖票的方法肯定使用synchronized同步锁,但售票要比一个窗口快的多。
因为我们买票是一系列程序操作,卖票只是其他一项,在排队中需要核查个人信息,咨询售票,验证信息,电话录入等,这才是主要的耗时操作。而多线程的执行,同时执行这些耗时操作,合理的利用资源。

4、synchronized和lock

功能上都是同步机制。
synchronized修饰后,只有方法结束,才会释放,如果发生异常或者想要中断,则没有办法处理。
因此lock在处理异常情况下有很大优势,

但是,有一点要注意的是如果使用的Lock,一定要手动释放维护,防止出现死锁现象。

5、wait()和notify()

wait()会释放锁,当释放后,要想重新获取wait()等待的对象,则用notify()方法重新唤醒。

6、sleep()

而sleep()不同的是,线程调用此方法后,会休眠一段时间,休眠期间,会暂时释放cpu,但并不释放对象锁。也就是说,在休眠期间,其他线程依然无法进入此代码内部。休眠结束,线程重新获得cpu,执行代码。

7、Android多线程下载原理

1、获取从服务器传来文件大小
2、使用线程池开多少线程?多上面多线程中的知识可以看出,并不是使用越多,效率越高,越快,而是合理的使用。
那么,对于android来说,一个下载任务,开多少线程比较合适呢?
根据picasso和glide框架可知,使用默认的数量是3-4;控制在一定范围内,但最多不要超过多少呢?一般是cup*2

8、多线程的缺点

  1. 等待共享资源时性能降低
  2. 需要处理线程的额外CPU花费
  3. 糟糕的程序设计导致不必要的复杂度。
  4. 有可能产生一些病态行为,如饿死,竞争,死锁等。
  5. 不同平台导致的不一致性。

ref:《JAVA编程思想》

你可能感兴趣的:(java基础)