多线程并发
1.并发和并行区别(引自stackoverflow回答)
并发是两个任务可以在重叠的时间段内启动,运行和完成。并行是任务在同一时间运行,例如,在多核处理器上。
并发是独立执行过程的组合,而并行是同时执行(可能相关的)计算。并发是一次处理很多事情,并行是同时做很多事情。
应用程序可以是并发的,但不是并行的,这意味着它可以同时处理多个任务,但是没有两个任务在同一时刻执行。
应用程序可以是并行的,但不是并发的,这意味着它同时处理多核CPU中的任务的多个子任务。
一个应用程序可以即不是并行的,也不是并发的,这意味着它一次一个地处理所有任务。
应用程序可以即是并行的也是并发的,这意味着它同时在多核CPU中同时处理多个任务。
2.多线程代价:
a.设计起来更复杂,查错难度更大
b.上下文切换消耗比较大
上下文切换:当cpu从执行一个线程切换到另外一个线程的时候,需要先存储当前线程池的数据,程序指针等,然后载入另外一个线程的数据,程序指针等,最后才开始执行
c.增加资源消耗:线程运行除了cpu之外,还需一些内存来维护其本地堆栈。
3.创建线程和启动方式:
a.myThread继承Thread重写run new myThread().start()
b.myRunnabe实现Runnable重写run new Thread(new myRunnable()).start()
*尽管启动线程的顺序是有序的,但是执行的顺序并非是有序的。
4.竞态条件:当两个线程竞争同一资源时,对资源的访问顺序敏感
临界区:导致竞态条件发生的代码区
5.局部变量存储在线程自己的栈中,因此其不会被多个线程共享
局部对象引用需要确保其他线程引用不到该对象才能保证线程安全
6.线程安全:一个资源的创建,使用,销毁都在同一个线程内完成,且不脱离该线程的控制
多线程操作时,初始化参数建议采用构造方法,而非set方法(不安全,非得使用时加上同步锁)
每个线程都有自己的线程栈,一个线程创建的本地变量对其他线程不可见,仅自己可见
7.同步方法:synchronized
a.实例方法同步是同步在拥有该方法的对象上
b.静态方法同步是指同步在该方法所在的类对象上
8.线程通讯:目标是使线程间能相互发送信号 参考:http://ifeve.com/thread-signaling/
a.通过共享对象变量通讯
b.忙等待,准备处理数据的线程等待数据变为可用的状态,没有对cpu进行有效的利用
c.通过wait() notify()和notifyAll()进行通讯(jvm中当调用wait时,会先检查当前线程是否是锁的拥有者,不是则抛出IllegalMonitorStateExcept)

9.ThreadLocal:让你创建的变量只被同一个线程进行读和写操作,被ThreadLocal修饰的变量值只对当前线程可见
ThreadLocal tl=new ThreadLocal();//实例化对象 set("赋值") get()取值
InheritableThreadLocal是ThreadLocal的子类。为了解决ThreadLocal实例内部每个线程都只能看到自己的私有值,所以InheritableThreadLocal
允许一个线程创建的所有子线程访问其父线程的值。
10.死锁:两个或更多的线程阻塞着等待其他处于死锁状态的线程所持有的锁。通常发生于多个线程但以不同顺序请求同一组锁的时候
11.避免死锁:
a.修改加锁顺序
b.加锁时限
c.死锁检测
12.饥饿:一个小城因为cpu时间片全部被其他线程抢走而得不到cpu运行时间产生的现象
原因:a.高优先级线程吞噬所有低优先级线程的cpu时间
b.线程被永久堵塞在一个等待进入同步块的状态(其他线程总是能在它之前持续地对该同步块进行访问)
c.线程在等待一个本身(在其上调用了wait方法)也处于永久等待完成的对象,因为其他线程总是持续地获得唤醒
解决(注意点):a.使用锁,而非同步快(锁相对公平)
b.公平锁
c.考虑性能
13.Java锁:
a.模拟锁的实现

b. 锁的可重入性:一个线程已经拥有了一个管程对象上的锁,则它有权访问被这个管程对象同步的所有代码块。
14.读写锁:
a.读取 没有线程正在做写操作,且没有线程在请求写操作
b.写入 没有线程正在做读写操作
15.信号量(Semaphore):是一个线程同步结构,用于在线程间传递信号,以避免信号丢失(concurrent包中已有实现)
16.阻塞队列:当队列为空时,从队列中获取元素的操作会被阻塞,或者当队列为满时,忘队列添加元素的操作会被阻塞
17.CAS(比较和替换):使用一个期望值和一个变量的当前值比较,如果当前变量的值与期望值相等,就使用一个新值替换
当前变量的值。
检车和替换必须是原子操作,可使用concurrent.atomic包的类来实现
18.进程与线程:
a.进程:拥有一个完整的、私有的基本运行资源集合,拥有一个或多个的线程
b.线程:存在于进程中,共享进程资源(包括内存和打开的文件)
posted on 2018-03-06 18:17 xiaojiayu0011 阅读(161) 评论(0) 收藏 举报
浙公网安备 33010602011771号