Java并发编程

基础知识

- 线程安全:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。无状态对象一定是线程安全的。 - 内置锁:synchronized关键字,每个java对象都可以用作一个实现同步的锁,称为内置锁或监视器锁。 - 重入: 某个线程获得一个已经由它自己持有的锁。一种实现方法是,为每个锁关联一个获取计数值和一个所有者线程,获得锁+1,释放-1,直至为0,锁释放。 - 活跃性和性能:活跃性,“某件正确的事情最终会发生”,对执行时间较长的操作,一定不要持有锁

对象的共享

- 重排序:在没有同步的前提下,编译器、处理器以及运行时都可能对操作的执行顺序做意想不到的调整。 - 加锁机制既可以确保可见性又可以确保原子性,而volatile变量只确保可见性。 - 线程封闭,尽在单线程内访问数据,自动实现线程安全。JDBC的con对象,由单个线程采用同步方式来处理,并且在con返回之前,连接池不会将它分配给其他线程。 - ThreadLocal,通常用于防止可变的单实例对象或全局变量进行共享。 - 在并发程序中使用和共享对象的策略: 1. 线程封闭 2. 只读共享 3. 线程安全共享,共享对象内部实现同步,外部线程通过公有接口进行访问 4. 保护对象,只能通过持有特定的锁来访问。

基础构建模块

- fail-fast,容器在迭代过程中被修改,抛出ConcurrentModificationException,实现方式是,将计数器与容器关联起来,并不是一种完备机制,只是善意的捕获并发错误。 - 并发容器 1. ConcurrentHashMap,分段锁,读线程并发访问,读写并发,一定数量的写并发,实现并发下的高吞吐量,弱一致性,非fail-fast。 2. CopyOnWriteArrayList,保证每次迭代的对象都是不变对象,写入时复制底层数组,并返回新数组,从而实现可变。 - 闭锁,一种同步工具类,可以延迟线程进度直到其到达终止状态。 1. CountDownLatch,初始一个计数器,await一直阻塞,直至计数器为0 2. FutureTask,表示一种抽象的可生成结果的计算,get阻塞,直至完成 3. Semaphore,管理者一组虚拟的许可,通过acquire和release来控制 - 栅栏,类似闭锁,它能阻塞一组线程直至某个事件发生,所有线程必须同时到达栅栏,才能继续执行。 1. CyclicBarrier,初始指定等待数量和执行动作C(Runnable),执行线程通过await方法阻塞,栅栏打破,执行C。 2. Exchanger,两线程交换数据

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

标题字号3红色

原文地址:https://www.cnblogs.com/lknny/p/6920701.html