多线程并发

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)    收藏  举报

导航