多线程相关

2016-09-10  本文已影响0人  玩裤

参考链接:
http://www.importnew.com/21353.html
http://blog.csdn.net/monkey_d_meng/article/details/6251879
https://zhuanlan.zhihu.com/p/20300609

总结:
1,线程6状态:NEW/RUNNABLE/RUNNING/BLOCKED/WAITING/TERMINATED
2,JAVA同步有4种方法:synchronized/wait/nofity,Lock/await/signal,BlockingQueue,PipedInputStream/PipedOutputStream
3,BlockingQueue:常用实现有4种(ArrayList/LinkedList/Delay~/Synchronous),主要方法有2个(put/take)

关于高并发的几个重要概念

并发和并行在外在表象来说,是差不多的。由图所示,并行则是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。所以单个cpu是不能做并行的,只能是并发。

临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。

死锁:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。就如同下图中的车都想前进,却谁都无法前进。
活锁,指事物1可以使用资源,但它让其他事物先使用资源;事物2可以使用资源,但它也让其他事物先使用资源,于是两者一直谦让,都无法使用资源。
饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。

阻塞:当一个线程进入临界区后,其他线程必须等待。非阻塞允许多个线程同时进入临界区
并发级别:阻塞和非阻塞(非阻塞分为无障碍、无锁、无等待)

有关并行的两个重要定律:Amdahl定律,Gustafson定律

只有当你调用线程的start方法时,线程才真正地被启动。(直接调用run方法是无法开启一个新线程的。)

线程的几种状态:New/Runanble/Blocked/Waiting/Terminated
等待状态有两种,一种是无限期等待,直到被notify。一直则是有限期等待,比如等待10秒还是没有被notify,则自动切换到Runnable状态。

Thread类中有3个变量定义了线程优先级。
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
让一个高优先级的线程和低优先级的线程同时争夺一个锁,看看哪个最先完成。
当然并不一定是高优先级一定先完成。再多次运行后发现,高优先级完成的概率比较大,但是低优先级还是有可能先完成的。

public static Map m=Collections.synchronizedMap(new HashMap());
同理对于List,Set也提供了相似方法。

上一篇 下一篇

猜你喜欢

热点阅读