Java 并发编程(多线程并发、同步、异步等)

线程三种安全:类型安全,内存安全和并发安全。

内存的原子性、可见性 & 有序性。

  在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。

-- 在并发编程领域,有两个关键问题:线程之间的通信和同步
线程的通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种共享内存和消息传递。
 1.在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典
型的共享内存通信方式就是通过共享对象进行通信。
 2.在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,在java中典型
的消息传递方式就是wait()和notify()。

> 同步,异步,串行与并行:
Java同步机制(同步方法或者同步块中)有4种实现方式:① ThreadLocal ② synchronized( ) ③ wait() 与 notify() ④ volatile 。 异步的同义语是非阻塞(None Blocking)。
-- 以通讯为例 
   同步:发送一个请求,等待返回,然后再发送下一个请求 
   异步:发送一个请求,不等待返回,随时可以再发送下一个请求 
   并发:同时发送多个请求

-- 串行与并行:
  有两种执行程序的方法。一种是顺序执行,另一程是并发执行。所谓顺序执行就是指程序中的程序段必须按照先后顺序来执行,也就是只有前面的程序段执行完
了,后面的程序段才能执行。这种做法极大地浪费了CPU资源,比如系统中有一个程序在等待I/O输入,那么CPU除了等待就不能做任何事情了。为了提高CPU的使用
效率、支持多任务操作,操作系统中引入了并发技术。所谓并发是指系统中的多个程序或程序段能够同时执行,这里的同时执行并不是指某一个时刻多段程序在同
进执行(除非有多个CPU),而是CPU能把时间分给不同的程序段。比如前面等待I/O的例子,若采用并发技术,当一个程序在等待I/O时,系统可以把CPU资源分配
给另外的程序,这样能减少CPU的空闲时间提高了资源利用率。

  线程通信、同步、协作是多线程编程中常见的问题。线程协作通常是采用线程休眠及唤醒来实现的,线程的休眠通过等待某个对象的锁(monitor)实现(wait
()方法),当其他线程调用该对象的notify()方法时,该线程就被唤醒。该对象实现在线程间数据传递,多个线程通过该对象实现协作。
  线程协作的经典例子是Java设计模式中的“生产者-消费者模式”,生产者不断往缓冲区写入数据,消费者从缓冲区中取出数据进行消费。在实现上,生产者与
消费者分别继承Thread,缓冲区采用优先级队列PriorityQueue来模拟。生产者将数据放入缓冲区的前提是缓冲区有剩余空间,消费者从缓冲区中取出数据的前提
是缓冲区中有数据,因此,这就涉及到生成者线程与消费者线程之间的协作。

-- 异步 同步 串行 并行,并发、并行、 阻塞、非阻塞
并发、并行、同步、异步、阻塞、非阻塞- https://www.cnblogs.com/Leo_wl/p/3507996.html#_label6
 微线程:又叫协程。 tasklet运行在伪并发中,使用channel机制进行同步数据交换。python中的greenlet提供了微线程的操作。不同于多线程,它给我们提供了一种更加轻量的异步编程模式。
 协程(Coroutine)提供了不同于线程的另一种方式,它首先是串行化的。其次,在串行化的过程中,协程允许用户显式释放控制权,将控制权转移另一个过程。释放控制权之后,原过程的状态得以保留,直到控制权恢复的时候,可以继续执行下去。所以协程的控制权转移也称为“挂起”和“唤醒”。
 并发(concurrency):并发是指二个和多个事件在同一时间间隔内发生。并发是在逻辑层面上的同时工作。
 并行(parallelism):并行是指二个或多个事件在同一时刻发生。 并行是在物理层面上的同时工作。
 同步(synchronous):在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
 异步(asynchronous):异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

 同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞。阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回。

线程中同步、异步、串行、并行- https://blog.csdn.net/l540675759/article/details/62932901
Java8新特性之并行流与串行流-https://www.aliyun.com/jiaocheng/808043.html
Fork/Join框架:就是在必要的情况下,将一个大任务,Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行join 汇总.

> 多线程与并发编程,java并发编程及并发包 java.util.concurrent
 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可
见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。
 Java并发编程-无锁CAS与Unsafe类及其并发包Atomic。经典线程,锁机制和同步原语。线程,线程池,锁和基本事件。
 
 在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访
问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他
锁有了很大提升。
   synchronized关键字进行同步.
   一般情况下,读写锁的性能都会比排它锁要好,因为大多数场景读是多于写的。在读多于写的情况下,读写锁能够提供比排它锁更好的并发性和吞吐量。Java
并发包提供读写锁的实现是ReentrantReadWriteLock. ReadWriteLock仅定义了获取读锁和写锁的两个方法,即readLock()和writeLock()方法,而其实现—
ReentrantReadWriteLock.
   读写锁同样依赖自定义同步器来实现同步功能,而读写状态就是其同步器的同步状态。回想ReentrantLock中自定义同步器的实现,同步状态表示锁被一个线程
重复获取的次数,而读写锁的自定义同步器需要在同步状态(一个整型变量)上维护多个读线程和一个写线程的状态,使得该状态的设计成为读写锁实现的关键。
  写锁是一个支持重进入的排它锁。如果当前线程已经获取了写锁,则增加写状态。如果当前线程在获取写锁时,读锁已经被获取(读状态不为0)或者该线程不
是已经获取写锁的线程,则当前线程进入等待状态.
   RentrantReadWriteLock不支持锁升级(把持读锁、获取写锁,最后释放读锁的过程)。原因也是保证数据可见性,如果读锁已被多个线程获取,其中任意线程
成功获取了写锁并更新了数据,则其更新对其他获取到读锁的线程不可见。


深入剖析基于并发AQS的重入锁(ReetrantLock)及其Condition实现原理- http://blog.csdn.net/javazejian/article/details/75043422
Java并发编程-无锁CAS与Unsafe类及其并发包Atomic- http://blog.csdn.net/javazejian/article/details/72772470
深入理解Java并发之synchronized实现原理- http://blog.csdn.net/javazejian/article/details/72828483
Java高并发编程:定时器、互斥、同步通信技术- https://blog.csdn.net/axi295309066/article/details/52915112
Java并发编程:核心理论:  http://www.cnblogs.com/paddix/p/5374810.html
Java并发编程:Synchronized及其实现原理: http://www.cnblogs.com/paddix/p/5367116.html
Java并发编程:Synchronized底层优化(轻量级锁、偏向锁): http://www.cnblogs.com/paddix/p/5405678.html
Java 并发编程:线程间的协作(wait/notify/sleep/yield/join):http://www.cnblogs.com/paddix/p/5381958.html
Java 并发编程:volatile的使用及其原理:http://www.cnblogs.com/paddix/p/5428507.html
并发编程 15 年- https://coyee.com/article/11571-15-years-of-concurrency
并发编程网- http://ifeve.com/
聊聊并发(一)——深入分析Volatile的实现原理-http://www.infoq.com/cn/articles/ftf-java-volatile
Java集合及concurrent并发包总结(转)- http://www.cnblogs.com/vijozsoft/p/5585620.html
Java 并发工具包 java.util.concurrent 用户指南- http://blog.csdn.net/defonds/article/details/44021605/

Android并发编程- http://blog.csdn.net/nugongahou110/article/category/5989691
Java并发及多线程并发- http://blog.csdn.net/wangyangzhizhou/article/category/2523519
Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解- http://blog.csdn.net/u010425776/article/details/54580082
关于Java并发编程的总结和思考- http://blog.csdn.net/qq_35101189/article/details/54880625
【Java】并发之锁与条件-- http://blog.csdn.net/rongxinhua/article/details/19245755
【Java】并发之阻塞队列-- http://blog.csdn.net/rongxinhua/article/details/19507937

Java并发编程系列之一:并发机制的底层原理: https://yq.aliyun.com/articles/14516

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值