
并发编程
搬砖升级打怪
这个作者很懒,什么都没留下…
展开
-
并发之基本的线程机制
并发并发是基于多核处理器编程的基本工具。通常是用来提高单处理器上的程序的性能。从性能的角度看,如果没有任务阻塞,单处理器机器上使用并发就没有什么意义。实现并发最简单的操作就是在系统级别使用进程。进程是运行在它自己的地址空间内的自包容的程序。多任务操作系统通过周期性地将CPU从一个进程切换到另一个进程,来实现同时运行多个程序。java的并发系统会共享诸如内存和I/O这样的资源,因此并发最基本的困难在于协调不同进程驱动的任务之间对这些资源的使用,以使得这些资源不会同时被多个任务访问。java在顺序语原创 2020-08-30 17:04:12 · 181 阅读 · 0 评论 -
Fork/Join框架
Fork/Join框架java7提供的一个用于并行执行的框架,是一个把大任务拆分成若干个小任务,然后把小任务的结果汇总得到大任务结果的框架。工作窃取算法定义:指某个线程从其他队列里窃取任务来执行。因为fork会将大任务分成若干个小的任务,然后为了减少线程之间的竞争,会将这些子任务放入到不同的队列中,并为每个队列创建一个单独的线程来执行。当某线程的队列任务执行完时,可以去其他队列里窃取任务来处理。为了减少窃取任务线程和被窃取任务的线程之间的线程,任务队列一般采用双端队列的设计,被窃取任务线程从原创 2020-08-10 00:15:15 · 130 阅读 · 0 评论 -
Executor框架
Executor框架Executor框架的两级模型java的线程被一对一映射为本地操作系统的线程。当java线程启动时,会创建一个本地操作系统的线程,当该java线程终止时,本地操作系统的进程也会被回收。操作系统调度所有的线程并将他们分配给可用的CPU。上层:java多线程程序将应用分解成多个任务,然后由用户级的调度器Executor框架将这些任务映射为固定数量的线程下层:由操作系统的内核将这些线程映射到硬件处理器上。Executor框架的结构任务:包括被执行任务需要实现的接口:Run原创 2020-08-07 23:26:13 · 126 阅读 · 0 评论 -
java中的线程池
java中的线程池java并发编程中运用场景最多的框架,主要优点是: 1. 降低资源消耗:通过重复利用已创建的线程来减少线程创建和消耗的开销 2. 提高响应速度:当任务到达时,可以不用等待线程创建就能立即执行 3. 提高线程的可管理性:避免重复创建,可以对线程池内资源进行统一分配,调优和监控。线程池的实现原理ThreadPoolExecutor的execute()方法的工作步骤:当有一个新的任务被提交到线程池时,线程池先判断核心线程池内的线程是否都在执行任务,如果不是,创建一个新的工作原创 2020-08-07 21:15:17 · 120 阅读 · 0 评论 -
java的并发工具类
java的并发工具类CountDownLatch被用来同步一个或者多个任务,强制去等待其他线程完成操作。CountDownLatch c = new CountDownLatch(3);//初始化一个CountDownLatch的对象的计数器的值为3;任何调用c.await()的方法都被阻塞,直至这个计数值为0;其他的任务完成工作的时候可以调用c.countDown()来减小计数器的值。CountDownLatch对象只能被触发一次,它的计数器的值是不能被重置的。CyclicBarrier可原创 2020-08-07 15:15:54 · 194 阅读 · 0 评论 -
java中的阻塞和非阻塞队列
java中的阻塞和非阻塞队列实现一个队列的线程安全,有两种方式: 1)使用阻塞队列,即出队和入队共用一把锁或者各自使用一把锁来实现 2)非阻塞队列:可以利用循环CAS的方式实现java中的阻塞队列阻塞队列是一个支持两个附加操作的队列,即支持阻塞的插入和移除。 1. 阻塞的插入:当前队列已经满了的时候,队列会阻塞插入元素的线程,直到队列不满 2. 阻塞的移除:当前队列为空的时候,获取元素的队列会阻塞直到队列为非空。处理方式:抛出异常,返回特殊值,一直阻塞或者超时退出。经常用于生产者和消费者原创 2020-08-07 11:44:13 · 659 阅读 · 0 评论 -
hashmap、hashtable和concurrenthashmap
hashmap、hashtable和concurrenthashmaphashMap继承自AbstarctMap类底层数据结构是:数组+链表+红黑树key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。初始容量为16,扩容是乘以2。线程不安全的键值对存储结构,当有多线程同时修改的时候可能会形成环结构,从而造成死锁问题。为什么容量要总是2的次幂:用与运算代替取模运算,速度快为了散列更均匀,利用0&1 = 0, 1&1原创 2020-08-07 10:13:07 · 133 阅读 · 0 评论 -
Java并发编程的艺术(三)
Java并发编程的艺术(三)线程是如何进行通信的?通过共享内存:通过共享内存的读写操作进行隐式的通信通过消息传递:没有共享内存时,就需要显示的发送消息来进行通信线程是如何同步的呢?首先同步是指程序中用于控制不同线程间操作发生相对顺序的机制。通过共享内存:需要通过对共享内存加锁进行线程间互斥来显示地进行线程同步。通过消息传递:因为消息发送一定在消息接收之前,所以是隐式的进行了线程同步。Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。原创 2020-08-06 22:22:16 · 157 阅读 · 0 评论 -
并发之共享资源
并发之共享资源不正确的资源访问:一个线程可能会在另一个线程读写数据的时候也进行了读写解决资源共享竞争: 基本上所有的并发模式在解决线程冲突问题的时候,都是采用序列化访问共享资源的方案。即给定时刻,只有一个任务能访问共享资源。 共享资源一般是以对象的形式存在的内存片段,但也可以是文件、输入/输出端口、或者是打印机。加锁:锁语句产生了一种互相排斥的效果,又称为互斥量Mutex。synchronized:java的关键字,重量级锁。要控制对共享资源的访问,首先得将它包装进一个对象。然后把所有要访问原创 2020-08-05 08:04:49 · 865 阅读 · 0 评论