zoukankan      html  css  js  c++  java
  • 多线程知识点总结

    多线程知识点总结
    参考:
    《java核心技术I》
    http://www.importnew.com/29212.html
    http://www.importnew.com/18126.html
    http://www.blogjava.net/xylz/archive/2010/07/08/325587.html

    1.什么是线程
    ...
    参考:https://blog.csdn.net/boshuzhang/article/details/50931781
    线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
    线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源
    2.中断线程
    interrupt
    3.线程的状态
    new(新创建),runnable(可运行),blocked(被阻塞),waiting(等待),time waiting(计时等待),dead(终止)
    4.线程的属性
    线程的优化级,守护线程
    5.同步
    5.1 同步问题产生的原因
    如果两个或两个以上线程需要共享对同一数据的存取,即产生了同步问题
    5.2 锁对象
    有两种机制防止代码块受并发问题的干扰。一个是java并发包下的ReentrantLock,另一个是java提供的synchronized关键字。
    5.3 条件对象
    java并发包下的条件对象Condition,方法await(等同线程的await),signalAll(相当于线程的notifyAll)
    5.4 synchronized关键字
    参考:http://uule.iteye.com/blog/1104562
    5.5 同步阻塞
    可使用现有的同步队列、类等解决同步问题
    5.6 volatile域
    参考:http://www.importnew.com/18126.html
    a. volatile关键字为实例域的同步访问提供了一种免锁机制。
    b. 并发编程中的三个概念:原子性(并发引起),可见性(主内存与高速缓存的差异),有序性(cpu指令重排引起)。
    c. 要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。
    d. Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。
    线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。
    e. 那么Java语言 本身对 原子性、可见性以及有序性提供了哪些保证呢?
    (1) 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。
    (2) 对于可见性,Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
    (3) 在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。
    f.volatile的使用场景:
    synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,
    但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。
    通常来说,使用volatile必须具备以下2个条件:
    1)对变量的写操作不依赖于当前值
    2)该变量没有包含在具有其他变量的不变式中
    5.7 线程局部变量
    ThreadLocal
    参考:https://blog.csdn.net/sonny543/article/details/51336457

    6.阻塞队列
    ...
    7.线程安全的集合
    ...
    8.callable与fature
    Callable与Runnable类似,但是Callable有返回值,并且有一个参数化的类型。
    Fature保存异步计算的结果。
    9.执行器
    Executor.
    10.同步器
    ...
    11.多线程生产者消息者问题
    使用await与notify或者notifyAll解决。
    12.死锁问题
    使用notifyAll或者wait(long mills)计时等待解决。
    13.解决同步问题的方法总结
    A、synchronized关键字加锁;B、ReentrantLock加锁;C、使用现有的同步队列、类等;D、使用volatile关键字。
    14.你使用过java.util.concurrent包下的哪些类?
    A、java.util.concurrent.ExecutionException;
    B、java.util.concurrent.Future;
    C、java.util.concurrent.Callable
    D、java.util.concurrent.SynchronousQueue
    E、java.util.concurrent.ThreadFactory;
    F、java.util.concurrent.ThreadPoolExecutor;
    G、java.util.concurrent.TimeUnit;
    H、java.util.concurrent.atomic.AtomicInteger;
    ...再加上资源池相应的包org.apache.commons.pool2下的包。

  • 相关阅读:
    SCU3033 Destroying a Painting(最小费用最大流)
    HDU4859 海岸线(最小割)
    ZOJ3228 Searching the String(AC自动机)
    HUST1024 dance party(最大流)
    SGU438 The Glorious Karlutka River =)(最大流)
    SPOJ839 Optimal Marks(最小割)
    BZOJ1086 [SCOI2005]王室联邦(树分块)
    SCU3109 Space flight(最大权闭合子图)
    HDU3138 Coconuts(最小割)
    ZOJ2539 Energy Minimization(最小割)
  • 原文地址:https://www.cnblogs.com/wjqhuaxia/p/9388076.html
Copyright © 2011-2022 走看看