多线程
林一末
余生多多指教
展开
-
AQS 个人见解
个人见解同步锁 = AQS + 基于AQS给出的方法自定义的释放获取锁的步骤。AQS = 维护共享变量 + 提供线程阻塞排队node。基于AQS给出的方法维护共享变量getState() setState() compareAndSetState()释放获取锁的步骤isHeldExclusively():该线程是否正在独占资源。只有用...原创 2019-04-12 17:45:21 · 114 阅读 · 0 评论 -
线程池
先学如下几个概念当前线程池的大小,最大线程池大小,核心线程池的大小当前线程池大小:表示当前工作者线程的数量。最大线程池大小:表示工作者线程的最大数量。核心线程池大小:表示工作者线程数量不大于最大工作者线程池的大小。这个概念存在以下关系当前线程池的大小 < 核心线程池的大小 < 最大线程池的大小核心线程池的大小 < 当前线程池的大小 <...原创 2019-04-18 20:01:42 · 421 阅读 · 0 评论 -
双缓冲与Exchanger生产者消费者模式
双缓冲的概念: 在多线程的环境下,有时候我们会使用两个或更多的缓冲区来实现数据从数据源到数据使用方的移动。其中一个缓冲区填满来自数据源的数据后可以被数据使用方进行“消费”,而另外一个空的缓冲区则用来填充来自数据源的新的数据。这里,负责填充缓冲区的是一个线程,而使用已填充完毕的另外一个缓冲区的则是另外一个线程。因此,当消费者线程消费一个已填充的缓冲区时,另外一个缓冲区可以由生产者...原创 2019-04-18 17:59:40 · 267 阅读 · 0 评论 -
信号量(Semaphore)的生产者消费者模式
使用 Semaphore 的生产者消费者模式public class Pattern1 { private final Semaphore semaphore; //这里的队列 这里默认为一般的容器,一般为无界的阻塞队列 private final BlockingQueue<String> queue; public Pattern1(Sem...原创 2019-04-18 10:36:26 · 496 阅读 · 0 评论 -
阻塞队列的生产者消费者模式
使用 阻塞队列 的生产者消费者模式public class Pattern { BlockingQueue<String> chanel = new ArrayBlockingQueue<String>(10); // 消费者 public synchronize String take() throws Exception{ ...原创 2019-04-18 10:05:32 · 292 阅读 · 0 评论 -
java 内存模型
什么是java模型:他规定了一些关键字的行为用来确保正确同步的java模型能够运行在不同架构的处理器上。我们从下面几个问题对 解答以下几个线程安全方面的问题原子性问题:在原子性方面,java 内存模型对除了 long/double 以外的基本数据类型以及引用类型的共享变量进行读、写操作都具有原子性。并规定对 volatile 修饰的 double/long 的变量进...原创 2019-04-17 20:57:25 · 315 阅读 · 0 评论 -
Synchronized,final关键字的作用
Synchronized:使用monitorenter和monitorexit指令实现的:monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处 每个monitorenter必须有对应的monitorexit与之配对 任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态并在 m...原创 2019-04-17 20:29:10 · 532 阅读 · 0 评论 -
简述缓存一致性 MESI
缓存一致性:保证数据在高速缓存区与主内存中数据的一致性,保证不同处理的读和写的安全。高速缓存的总结构 :缓存条目的结构:tag 存放数据的内存地址 data 存放数据(副本) flag 存放各个的状态 缓存条目的 flag的 MESI 的 状态信息:M(修改) 存在tag相同,但是flag 仅仅只有唯一的一个,数...原创 2019-04-14 13:43:45 · 424 阅读 · 0 评论 -
volatile 的 内存屏障
如下的 写 和 读 就是对 volatile 变量进行变量值的读写操作。为什么在写操作后加入StoreLoad 因为storeLoad 相当于一个存储屏障和加载屏障,能够把执行处理器的写缓冲区的内容冲刷到高速缓存中去,还能情况执行处理器的无效化队列,把其他处理器的更新情况更新到执行处理器当中。为什么在写操作前加入释放屏障 保证了vol...原创 2019-04-16 21:53:02 · 1361 阅读 · 2 评论 -
内存屏障
内存屏障的作用: 保障各个执行处理器的线程的可见性,有序性。基本的内存存储屏障: LoadLoad 保证屏障前面的读先于屏障后面的读 (解决无效化队列问题) StoreStore 保证屏障前面的写操作先于屏障后的写操作 (解决写缓冲器问题) LoadStore 保证屏障前面的读操作先于屏障后面的读操作 ...原创 2019-04-16 17:09:51 · 398 阅读 · 0 评论 -
线程问题产生原因:写缓冲器与无效化对列问题
引入写缓冲器与无效化队列的目的: 从 MESI 我们可以得知,在进行写数据的时候是处于一种阻塞的状态,只有等待写操作进行完毕,其他处理器存于高速缓存的数据被设置为 I (无效)的时侯,待其返回设置完毕的命令的时候,我们的执行处理器才能够继续执行。这个问题导致了延迟,我们也是为了解决这个问题,而导入写缓冲器与无效化队列。解决完毕以后的处理器在进行操作就是相当于一种异步的方式。...原创 2019-04-16 14:18:13 · 563 阅读 · 0 评论 -
对线程的中断
这里我们先来讲一下已经被弃用的 stop() 以及 suspend() 这两个方法stop()反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,假如一个线程正在执行:synchronized void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证x,y被同时赋...原创 2019-04-19 14:51:53 · 175 阅读 · 0 评论