首页 > 其他分享 >并发

并发

时间:2022-11-09 13:59:52浏览次数:39  
标签:java concurrent 队列 lock util 并发 线程

线程状态

  • New(新建):刚new Thread()创建,还没开始运行run
  • Runnable(可运行):调用start方法,可能正在运行也可能没有运行
  • Blocked(阻塞):要获得一个锁
  • Waiting(等待):等待通知
  • Timed waiting(计时等待):等待超时或通知
  • Terminated(终止):运行结束或异常结束

中断线程

  • 对一个线程实例调用interrupt()方法会向该线程发送一个中断请求,并将该线程的中断状态设置为true
  • 如果一个线程处于等待或者阻塞状态时,收到中断请求会抛出InterruptedException异常
  • 线程可以通过Thread.currentThread().isInterrupted()来获取当前线程的中断状态

未捕获异常的处理器

  • 自定义实现 Thread.UncaughtExceptionHandler接口的类
  • 可以用setDefaultUncaughtExceptionHandler为所有线程配置一个默认的处理器,也可以为单个线程配置
  • 单个线程默认的处理器是该线程的ThreadGroup对象

锁对象

  • 接口:java.util.concurrent.locks.Lock
  • 实现类:java.util.concurrent.locks.ReentrantLock
    可重入锁,可以反复获取已经拥有的锁。锁有一个持有计数来跟踪对lock方法的嵌套调用,线程每一次调用lock后都要调用unlock来释放锁。由于这 个特性,被一个锁保护的代码可以调用另一个使用同一个锁的方法。
  • 获取锁对象: Lock lock = new ReentrantLock()
  • 上锁:lock.lock()
  • 释放锁:lock.unlock()

条件对象

接口:java.util.concurrent.locks.Condition
获取条件对象:Condition condition = lock.newCondition()
将该线程放在这个条件的等待集中:condition.await()
解除该条件等待集中所有线程的阻塞状态:condition.singnalAll()

Lock和Condition总结

  • 锁用来保护代码片段,一次只能有一个线程执行被保护的代码
  • 锁可以管理试图进入被保护代码段的线程
  • 一个锁可以有一个或多个相关联的条件对象
  • 每个条件对象管理那些已经进入被保护代码段但不能运行的线程

synchronized关键字

同步方法

  • java中每个对象都有一个内部锁,并且这个锁只有一个内部条件。
  • 如果一个实例方法声明时有synchronized关键字,那么该实例对象的锁将保护整个方法。
  • 如果一个静态方法声明有synchronized,那么该类对象(Class)的内部锁保护整个方法
  • wait() / notify() / notifyAll() /

同步块

使用一个对象的锁来实现额外的原子操作。

synchronized(obj){
...
}

volatile

  • volatile关键字为实例字段的同步访问提供了一种免锁机制。如果声明一个字段为volatile,那么编译器和虚拟机就知道该字段可能被另一个线程并发更新。

final变量

final HashMap<String,Integer> map = new HashMap<>();
如果不使用final,不能保证其他线程看到的是map更新后的值,可能看到null,而不是Hashmap。
当然map的操作不是线程安全的。

原子性

java.util.concurrent.atomic包下面有很多原子操作的类,不加锁实现原子操作,

线程安全的集合

位于java.util.concurrent包下

阻塞队列blocking queue

很多线程安全的问题都可以使用一个或多个队列以优雅而安全的方式来描述,生产者线程向队列插入元素,消费者线程则获取元素。使用队列可以安全地从一个线程向另一个线程传递数据。

标准类库中提供的阻塞队列:
接口:

  • java.util.concurrent.BlockingQueue
  • java.util.concurrent.BlockingDeque

实现:

  1. ArrayBlockingQueue:指定容量,可以设置公平性,实现为循环数组
  2. LinkedBlockingQueue:无容量上线的阻塞队列或双向队列,实现为链表
  3. LinkedBlockingDeque:无容量上限的包含Delayed元素的阻塞队列
  4. DelayQueue
  5. PriorityBlockingQueue:无容量上限,实现为堆

任务和线程池

Callable与Fature

  • Callable封装一个异步执行的任务,并且有返回值
  • Fature保存异步计算的结果

FutureTask

执行Callable的一种方式是FutureTask,它实现Future和Runnable接口,可以构造一个线程来运行这个任务

执行器Executors

执行器有很多静态工程方法,用来构造线程池。返回的都是实现了ExecutorService接口的实例。


控制任务组

fork-join

用于将一个大任务分解成子任务,并行处理,最后再汇总结果

异步计算

  • Future通过get方法获取值时会阻塞,直到值可用。
  • CompleableFuture类可以通过注册一个回调,一旦值可用,就会通过结果调用这个回调。
  • CompletableFuture有很多同步和异步的方法,可以组合这些方法实现不同效果。

进程

标签:java,concurrent,队列,lock,util,并发,线程
From: https://www.cnblogs.com/studyhaha/p/16845243.html

相关文章

  • Linux高并发网络编程开发——广播-组播-本地套接字
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。10-Linux系统编程-第14天(广播-组播-本地套接字)一、学习目......
  • Linux高并发网络编程开发——epoll-udp
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。10-Linux系统编程-第13天(epoll-udp)目录:一、学习目标二、复习1、通过gdb定位段错误的位置2、TCP状态转换复习三、epoll......
  • Linux高并发web服务器开发——web服务器 - 1
    在学习Linux高并发web服务器开发总结了笔记,并分享出来。11_服务器开发-第01天(web服务器-1)  一、复习       二、html1、html介绍》HTML简介:​​https://www.w3s......
  • Linux高并发网络编程开发——网络编程基础-socket
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。10-Linux系统编程-第10天(网络编程基础-socket)目录:一、Linux网络编程阶段二、网络基础1、网络开发两种设计模式2、协......
  • Linux高并发网络编程开发——tcp三次握手-并发
    在学习Linux高并发网络编程开发总结了笔记,并分享出来。10-Linux系统编程-第11天(tcp三次握手-并发)  一、学习目标1、熟练掌握三次握手建立连接过程2、熟练掌握四次挥手断开......
  • 常用的并发工具类
    CountDownLatch概念CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一......
  • Linux高并发web服务器开发——web服务器-3
    在学习Linux高并发web服务器开发总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。11_服务器开发-第03天(web服务器-3)  一、学习目标1、......
  • parallelStream并发流线程安全问题
    parallelStream并发流线程安全问题起因公司项目中用到定时任务进行数据获取任务,由于返回数据的类型是字符串,需要进行转换,变为我们定义的类型id,在准备我们定义的类型Ma......
  • 并发编程 - Atomic & Unsafe
    1.全面地走一遍Atomic包下面的原子类;2.CAS->原子比较与交换算法的bug-ABA问题;3.魔法类-Unsafe,ini->堆外内存Atomic1.atomic底层实现是基于无锁算法-cas;......
  • JUC并发编程第二章之Java线程
    JUC并发专题系列JUC并发编程第一章之进程与线程JUC并发编程第二章之Java线程JUC并发编程第三章之共享模型之管程JUC并发编程第四章之共享模型之内存JUC并发编程第五章......