• 1.多线程博客学习


    1.

    JDK 5.0 起提供了线程池相关API:ExecutorService 和 Executors
    ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor.
    void execute(Runnable coommand):执行任务/命令,没有返回值,一般用来执行Runnable
    Future submit(Callable task):执行任务,有返回值,一般又来执行Callable
    void shutdown():关闭连接池。

    2.Thread和Runnable在java.lang包下,Thread类是Runnable接口的实现类,Callable接口在java.util.concurrent包下

    3.线程池:Executor---ExecutorService---AbstractExecutorService---ThreadPoolExecutor

    Matrix海子博客

    1.线程进程区别

    2.如何创建线程

    (1)让多个线程执行一个任务;让一个线程执行一个子任务

      1.继承Thread类

      继承Thread类的话,必须重写run方法,在run方法中定义需要执行的任务。

    创建任务的同时创建线程

      2.实现Runnable接口

    创建任务和创建线程分离

    Runnable的中文意思就是:任务

      3.Runtime,顾名思义,即运行时,表示当前进程所在的虚拟机实例。

    3.Thread类的使用

    join方法内部调用的是wait方法,所以也会释放锁

    4.synchronized

    从反编译获得的字节码可以看出,synchronized代码块实际上多了monitorenter和monitorexit两条指令

    对于synchronized方法,执行中的线程识别该方法的 method_info 结构是否有 ACC_SYNCHRONIZED 标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。

    有一点要注意:对于synchronized方法或者synchronized代码块,当出现异常时,JVM会自动释放当前线程占用的锁,因此不会由于异常导致出现死锁现象

    5.Lock

    也就是说Lock提供了比synchronized更多的功能

    (1)Lock是一个接口,在java.util.concurrent.locks包下。ReentrantLock实现了Lock接口

    (2)ReadWriteLock

    读写锁

      读写锁将对一个资源(比如文件)的访问分成了2个锁,一个读锁和一个写锁

    正因为有了读写锁,才使得多个线程之间的读操作不会发生冲突。

    个用来获取读锁,一个用来获取写锁。也就是说将文件的读写操作分开,分成2个锁来分配给线程,从而使得多个线程可以同时进行读操作

    ReentrantReadWriteLock实现了ReadWriteLock接口。

    6.volatile关键字解析

    (1)java内存模型

    (2)volatile的作用:保证内存可见性,禁止指令重排序

    7.ThreadLocal

    ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量

    最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等

    8.同步容器

    (1)在Collections类中提供了大量的方法,比如对集合或者容器进行排序、查找等操作。最重要的是,在它里面提供了几个静态工厂方法来创建同步容器类

    9.CopyOnWrite

    CopyOnWrite容器即写时复制的容器

    (1)从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet

    (2)通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

    (3)CopyOnWrite并发容器用于读多写少的并发场景

    10.并发容器

    (1)ConcurrentHashMap代替同步的Map

    (2)CopyOnWriteArrayList和CopyOnWriteArraySet分别代替List和Set,迭代过程要保证不出错,除了加锁,另外一种方法就是"克隆"容器对象。

    11.阻塞队列

    12.Future

    (1)RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口

    13.面试题

    (1)有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类

    (2) 在多线程中,什么是上下文切换(context-switching)?

    上下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行

    14.如何确保线程安全?

    在Java中可以有很多方法来保证线程安全——同步,使用原子类(atomic concurrent classes),实现并发锁,使用volatile关键字,使用不变类和线程安全类。在线程安全教程中,你可以学到更多。

  • 相关阅读:
    分布式基础学习(1)--分布式文件系统
    吞吐量(Throughput)、QPS、并发数、响应时间(RT)对系统性能的影响
    单点登录SSO的实现原理
    Java基础学习总结——Java对象的序列化和反序列化
    谈谈Memcached与Redis
    Java并发集合的实现原理
    Head First 设计模式 第4章工厂模式
    CentOS Linux 系统 英文 改中文
    Red Hat 9.0 Linux 分辨率修改
    Head First 设计模式 第5章 单例模式
  • 原文地址:https://www.cnblogs.com/midiyu/p/15256374.html
Copyright © 2020-2023  润新知