随笔分类 - 多线程
摘要:https://www.cnblogs.com/flgb/p/13022787.html Semaphore 用来控制同时访问特定资源的线程数量,通过协调保证合理的使用公共资源理解 比作控制车流的红绿灯,如马路要控制流量,只限制100辆车通行,其他必须在路口处等待,不能行驶在马路上,当其中有5辆离开
阅读全文
摘要:AQS Java并发编程的核心在于java.util.concurrent包。而juc当中大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这个行为的抽象就是基于AbstractQueuedSynchronizer,简称AQS。AQS定义了一套多线程访问共享资
阅读全文
摘要:等待唤醒机制: 1:我们知道Object中有wait/notify机制,但是这种机制是基于Monitor机制实现,使用Monitor Object操作的,所以wait/notify方法是在sychronized作用域范围内才能使用的,不然会报错。 而且notify要在wait方法调用之后进行调用才有
阅读全文
摘要:管程/监视器 上一篇文章提到了Sychronized重量级锁的时候是基于操作系统metux,其实Java中sychronized是一种monitor机制来保证并发的。可以称为管程或监视器。 同步方法和同步代码块底层都是通过monitor来实现同步的。每个对象都与一个monitor相关联。 上篇也提到
阅读全文
摘要:Thread类是怎么创建线程的 java中运行一个线程有好多方式,比如实现一个Runnable接口然后传递给Thread构造函数,还是交给线程池来创建线程执行等等。但是最后都是创建new Thread对象,最后通过thread.start方法来启动一个线程。 但是Java中Thread类只是一个普通
阅读全文
摘要:转载:https://blog.csdn.net/worldchinalee/article/details/83790790 说下结论:就是用if判断的话,唤醒后线程会从wait之后的代码开始运行,但是不会重新判断if条件,直接继续运行if代码块之后的代码,而如果使用while的话,也会从wait
阅读全文
摘要:上篇文章记录到volatile在硬件层面怎么保证线程间可见性的,是通过lock锁缓存行缓存一致性协议来实现的。但是这样会有一个伪共享的问题。 首先缓存行在64bit机中一般为64字节,具体缓存行大小可以通过下面的命令查看: cat /proc/cpuinfo 假设有一个对象有两个long类型的数据x
阅读全文
摘要:as-if-serial as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义。 为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作
阅读全文
摘要:并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间
阅读全文
摘要:JVM:Java virtual machine(java虚拟机) 我们都知道java语言是可以夸系统的,正是使用虚拟机技术,java可以编译成虚拟机可以识别的指令,然后在虚拟机上运行。不同的系统统一遵循java虚拟机规范(https://docs.oracle.com/javase/specs/j
阅读全文
摘要:如上类图,Executors 其实是个工具类,里面提供了好多静态方法,根据用户选择返回不同的线程池实例。 ThreadPoolExecutor 继承了 AbstractExecutorService,成员变量 ctl 是个 Integer 的原子变量用来记录线程池状态 和 线程池中线程个数,类似于
阅读全文
摘要:一:创建线程的几种方式 1:继承Thread。 其实Thread这个类实现了Runnable这个接口,所以我们可以直接通过继承Thread然后重写run方法,直接new子类start就可以创建一个线程来执行。 2:实现Runnable。 我们知道Java中是单继承多实现的,所以通过继承实现有很大的局
阅读全文