Java并发
文章平均质量分 52
java并发
姜希成
岁月流逝,将来的某时某处,我会在叹息中想起,林间的路分成两股,而我选择了人迹罕至之徒,那一刻起,一切差别已成定铸。
展开
-
Stream 数据切片
List<String> symbols = ... int step = 100; // 按100切片 List<List<String>> symbolsList = Stream.iterate(0, n -> n + 1) .limit((symbols.size() + step - 1) / step) .parallel() ...原创 2021-05-11 18:37:53 · 493 阅读 · 0 评论 -
synchronized 关键字原理
OS 有哪些方法来完成同步:互斥量 pthread_mutex_t:重量锁,拿不到锁就 sleep,会进入内核态synchronized 使用了 mutex自旋锁 pthread_spin_t:OS 空转信号量 semsynchronized 字节码原理:monitorenter monitorexit,会在异常表处理异常,保证调用monitorexit 退出临界区,并调用 athorw 抛出异常。对象头对象布局:对象头Mark Word:64 bit类型指针 klass原创 2021-04-08 10:26:35 · 199 阅读 · 0 评论 -
JNI
package org.jxch.study;public class Demo { static { System.loadLibrary("DemoNative"); } private native void demo(); // 回调 Java 方法 private void callback() { System.out.println("callback"); }}编译头文件 javac原创 2021-04-07 18:46:09 · 127 阅读 · 0 评论 -
Java 线程实现原理
Linux 操作系统中创建线程的方式int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);参数名参数定义参数解释pthread_t *thread传出参数,调用之后会传出被创建线程的idconst pthread_attr_t *attr线程属性一般传 NULL,原创 2021-04-07 18:21:00 · 275 阅读 · 0 评论 -
JDK15 —— AQS 源码
使用方法通用 API独占式获取accquireacquireInterruptiblytryAcquireNanos共享式获取acquireSharedacquireSharedInterruptiblytryAcquireSharedNanos独占式释放锁release共享式释放锁releaseShared需要子类覆盖的流程方法独占式获取 tryAcquire共享式获取 tryAcquireShared独占式释放 tryRe原创 2021-04-03 22:21:53 · 175 阅读 · 0 评论 -
AQS
AQS(AbstractQueuedSynchronizer):获取锁: 独占式获取 accquire acquireInterruptibly tryAcquireNanos 共享式获取 acquireShared acquireSharedInterruptibly tryAcquireSharedNanos释放锁: 独占式释放锁 release 共享式释放锁 releaseShared同步状态: 获取当前的同步状态 getState 设置当前同步原创 2020-09-30 12:51:34 · 94 阅读 · 0 评论 -
CAS
CAS: Compare and swap 比较和交换在指令的级别,保证该操作的原子性。原理如果这个内存地址的值是我所期望的值,那么就把它设成新值。比如,如果内存地址为100的位置的值是1,我想把值改为2,那么CAS赋值操作就是这样的:如果内存地址为100的位置值是1,那么就把值设为2.所以如果其他线程在此之前把值改为了3,则这个CAS赋值失败。因此就出现了自旋(死循环)CAS赋值操作(每次CAS期望的值都从内存中现取一份)。基于这样的特性,CAS又可用于乐观锁。悲观锁是每次执行代码都是先加锁再原创 2020-09-30 12:38:57 · 121 阅读 · 0 评论 -
并发执行框架
FutureTask单线程执行框架。获得线程执行的返回值。Callable包装成FutureTask,传入Thread对象中(继承了Runnable),start启动线程,然后通过Future接口的get()拿到返回值。Callable<Object> callable = new Callable<>(){ @Override public Object call() { Object obj = new Object(); // ... reutrn o原创 2020-09-30 12:14:27 · 223 阅读 · 0 评论 -
并发工具类
CountDownLatch只能用一次。CountDownLatch countDownLatch = new CountDownLatch(5);当一组线程调用countDownLatch的await方法时,进入等待。直到其他线程调用完5次countDown方法。CyclicBarrier可以循环使用CyclicBarrier cyclicBarrier = new CyclicBarrier(5);当5个线程都调用了await方法时,这5个线程同时继续运行,否则继续等待。Phaser原创 2020-09-30 11:15:00 · 70 阅读 · 0 评论 -
基础知识
Java中启动一个线程的方式只有两种:继承Thread类,实例化,调用start()通过Runnable new 出Thread对象,调用start()也就是说,在Java中除了Thread类中的start方法,没有第二种方案可以启动一个线程。synchronized内置锁,线程进入该对象的等待队列对象锁类锁,使用该类的class对象加锁。如,给类静态方法上锁。volatile只保证可见性,不保证原子性。适用于一个线程写,多个线程读。Object::wait()等待该对象,进入原创 2020-09-30 10:52:15 · 200 阅读 · 0 评论 -
概念
进程、线程、协程进程:程序运行资源分配的最小单位,进程内部有多个线程,会共享这个进程的资源线程:CPU调度的最小单位,必须依赖进程而存在。协程:依赖线程而存在,完全由程序所控制,也就是在用户态执行。一个线程的多个协程的运行是串行的。当一个协程运行时,其它协程必须挂起。同样存在上下文切换问题。更加轻量级,但用的不好可能还不如直接使用线程。并行、并发并行:同一时刻,可以同时处理事情的能力并发:单位时间内,可以处理事情的能力线程:Thread协程:quasar、kotlin原创 2020-09-30 10:01:26 · 110 阅读 · 0 评论