java高并发基础总结笔记

NIO

重点:NIO的概念和作用,粘包问题,常见协议,基本概念

AIO是异步阻塞式IO

BIO是同步阻塞式IO————面向通道操作缓冲区

NIO是非阻塞式IO——面向流操作字节字符

NIO有三个组间,分别为:Buffer、Channel、Selector

Buffer有三个属性capacity、position、imit

capacity:指定了可以存储在缓冲区中的最大数据容量,实际上,他指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量

position:下一次读取或写入的位置

limit:指定还有多少数据需要取出(在缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)

Channel有两个实现通信的类SocketChannel、ServerSocketChannel

SocketChannel、ServerSocketChannel支持异步通信

java.net也有两个实现socket通信的类,分别是Socket和ServerSocke 

服务器必须先建立ServerSocket或者ServerSocketChannel来等待客户端的链接

客户端必须建立相对应的Socket或者SocketChannel来与服务器建立链接

服务器接收到客户端的连接后,在生成一个Socket或者SocketChannel与此客户端通信
不过Socket和SocketChannel可以通过 socket.channel() SocketChannel.socket() 方法相互转换

同理ServerSocket 和ServerSocketChannel 也可以相互转换

Selector
            select()

粘包问题解决方法:1.使用协议约定传输规则   2.固定长度数据  3.约定分隔符  4  使用特定格式传输

常见的协议有公有协议(公共,都认可)和私有协议(自己使用开发的)、

阻塞   非阻塞 --线程

同步和异步:参与并发的双方的协调机制是否需要互相等待

 

 

 

 

Concurrent

Concurrent ——java的并发包 - jdk5开始有的 - 提供了大量的工具类

BlockingQueue - 阻塞式队列 - 生产者消费者问题,很好的解决了多线程中,高效安全传输数据的问题,

队列的特点是先进先出。(FIFO)

特点:

不接受null元素

可以是限定容量的

主要用于生产者-使用者队列,但它另外还支持了Collection接口

线程是安全的

附论坛资料:https://blog.csdn.net/qq_42135428/article/details/80285737


   ConcurrentMap - 线程安全的Map - 锁更加的精细 - 读写锁

基于lock操作的,保证同步的时候,锁住的不是整个对象,当多线程对Concurrentmap操作时,不是完全锁住map,而是锁住相应的segment。这样提高了并发效率

haseMap

1.hashMap默认不是线程安全的

2.HashMap是map接口的事例,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,单可以包含重复值

3.hashMap允许null key和null value,而hashtable不允许

4.因为线程安全的问题,HashMap效率比HashTable的要高,应用程序一般在更高的层面上实现了保护机制,而不是依赖于这些底层数据结构的同步

hashTable

1.HashMap是非线程安全的,HashTable是线程安全的,内部的方法几本都是synchronized

2.HashTable不允许有null值的存在
   CountDownLatch - 闭锁

CountDownLatch是java.util.concurrent包下的一个同步辅助类,它能使一个或多个线程在其他的县城的一系列操作完成之前一直等待,初始化值为计数器大小(即线程数量)
使用场景:1.同时启动多个线程 2.多个线程操作完成之前一直等待

       

 CyclicBarrier,是一个同步辅助类,作用和CountDownLatch几乎一模一样,CyclicBarrier是向上记数,CountDownLatch是向下记数,区别是CyclicBarrier记数可以重置
        Exchanger

                      Exchanger类源于java.util.concurrent包,可以在两个线程之间传输数据, Exchanger中的public v exchange(V x) 方法被调用后等待领一个线程到达交换点(如果当前县城没有被中断),然后将已知的对象传给它,返回接受的对象。

                      如果另外一个县城已经在交换点等待,那么恢复县城计划并经手通过当前线程传给的对象


        Semaphore

                      Semaphore又称信号量,在java并发编程中,信号量控制的是线程并发的数量,负责协调各个线程,以保证他们能够正确、合理的使用公共资源的设施,也是操作系统中用于控制进程同步互斥的量。
   ExecutorService - 执行器服务 - 线程池

            为了解决执行服务的生命周期问题,Executor扩展了ExecutorService接口,添加了一些用于生命周期管理的方法
            手动创建线程池 - ThreadPoolExecutor
                ThreadPoolExecutor(int corePoolSi.

eaze, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) 
                shutdown将执行平缓的关闭过成:不再接受新任务,并且等待已经提交的任务完成


                shutdownNow 表示立即关闭
            通过工具类创建线程池
                Executors,是最顶层的一个接口,为异步任务执行框架提供了基础,该框架能够支持多种不同类型的任务执行策略,主要有一个抽象方法:execute(Runnable command),主要用于将任务的提交过程与执行过程解耦开来,并用Runnable来表示任务
      Lock - 锁 - 线程同步 - Synchronized
            lock()
            unlock()
            tryLock()
            -ReadWriteLock
                读锁和读锁可以共存
                写锁和任何锁都不能共存
            
        Atomic

序列化、反序列化

        将内存中动态对象信息 固定为 确定字节信息 - 序列化
        将序列化都对象信息 恢复为内存中都对象信息 - 反序列化

        持久化
        RPC:远程过程调用,是一种计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程

        HTTP是属于OSI模型中的应用层协议,而RPC是一种通信协议

        java原生都序列化反序列化
        GoogleProtoBuffer
        Thrift
        AVRO
    RPC - 掌握概念 - 不需要掌握实现过程
        java远程方法调用 是java分布式程序的基础
        并不是一项新的技术 而是对若干技术对整合 是一种解决方案
        序列化反序列化 网络通信 代理技术。。

Zookeeper

概念
            分布式资源协调 分布式环境下的数据的一致性保证
            数据发布订阅、负载均衡、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等功能

 

你可能感兴趣的:(java)