
关于并发的一些总结
文章平均质量分 68
小白免与大能猫
这个作者很懒,什么都没留下…
展开
-
并发的基础
程序、进程和线程:进程:是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。线程:是进程的一个实体,是 cpu 调度和分派的基本单位,是比程序更小的能独立运行的基本单位。一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行 。单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。如果是多核的话,才能更好的发挥多线程的效率。一个Java应用程序java.exe,其实至少有三个线程:main()主线...原创 2021-08-27 22:22:12 · 220 阅读 · 0 评论 -
线程的创建
线程的创建和启用:创建新线程的方法:1、继承Thread类Thread类的特性:1、每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体。2、通过该Thread对象的start()方法来启动这个线程,而非直接调用run()。步骤:1、定义子线程类继承Thread类。2、子线程类中重写Thread类中的run方法。3、创建Thread子线程类对象。4、调用子线程对象start方法:①启动新线程;②调用当前线程r.原创 2021-08-27 22:21:41 · 300 阅读 · 0 评论 -
线程的状态
线程的状态:操作系统层面5种:新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,只是没分配到CPU资源。运行:当就绪的线程被调度并获得CPU时间片资源时,便进入运行状态,run()方法定义了线程的操作和功能。阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU时间片调度并临时中止自己的执行,进入阻塞状态。死亡:线程完成了它的全部工作或线程原创 2021-08-27 22:21:08 · 93 阅读 · 0 评论 -
线程的同步
线程的同步:1、线程安全问题:当多个线程对具有共享变量的多个语句执行写操作时(不能只看成执行同一个run方法,也可能在不同的run方法也有共享变量)时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程就开始执行。导致共享数据(共同操作的变量)的错误。3、解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不能执行。对共享变量进行写入时,结果要正确,必须保证是原子操作。原子操作是指不能被中断的一个或一系列操作。①阻塞式:synchronized,LOCK锁,原创 2021-08-27 22:20:39 · 77 阅读 · 0 评论 -
线程的通信
可以在synchronized关键字下使用:使用wait/notify线程通信:wait/notify的原理如下锁对象.wait():让该线程进入Monitor的WaitSet中,并释放当前锁。调用此方法后,当前线程将释放对象监控权 ,然后进入等待WAITING状态。在当前线程被notify后会立刻进入Monitor的EntryList中处于BLOCLED状态,等待锁的释放然后重新竞争锁,竞争成功后从断点处继续代码的执行。用if判断的话,唤醒后线程会从wait之后的代码开始运行,但是不会重新原创 2021-08-27 22:19:59 · 76 阅读 · 0 评论 -
Synchronize锁原理
synchronized修饰代码块每个 Java 对象都可以关联一个 Monitor 对象,Monitor对象由jvm提供。当字节码指令执行到monitorenter 指令时,该java对象的对象头mark word指向一个Monitor ,此时该对象可以作为锁,计数器+1。当执行到monitorexit 指令时,计数器-1。当计数器为0时说明没有重入,释放锁!!!!!!!!!!!!!!这也是synchronized的可重入原理。以上是成功获取锁的情况,在Monitor底层中,如果Mon原创 2021-08-27 22:18:56 · 186 阅读 · 0 评论 -
JMM和内存问题
JMM java内存模型,JMM 的主要目的是定义程序中各种变量的访问规则, 以实现让Java程序在各种平台下都能达到一致的内存访问效果。JMM 规定所有实例变量和静态变量都存储在主内存,每条线程有自己的工作内存,工作内存中保存被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作空间进行,不能直接读写主内存数据。不同线程间无法直接访问对方工作内存中的变量,线程通信必须经过主内存。主内存:我们常说的物理内存,共享变量(实例变量,静态变量)都存储在主内存中 。工作内存:指每个.原创 2021-08-27 22:17:19 · 246 阅读 · 0 评论 -
关于线程池
JDK中提供的线程池ThreadPoolExecutor和ScheduledExecutorService创建线程池的几种方法线程池的常用创建方式主要有两种,通过Executors工厂方法创建(内部调用了ThreadPoolExecutor)和直接newThreadPoolExecutor方法创建。线程池的工作流程线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务。当线程数达到 corePoolSize ...原创 2021-08-25 11:45:35 · 755 阅读 · 0 评论 -
CAS乐观锁
CAS乐观锁:该操作由sun.misc.Unsafe类里面的compareAndSwapInt()和compareAndSwapLong()和compareAndSwapObject()等几个方法包装提供。J.U.C包里面的原子类, 例如compareAndSet()和getAndIncrement()等方法都使用了Unsafe类的CAS操作来实现。 CAS是比较并交换由Unsafe类的compareAndSwap方法提供,能保证修改变量操作的原子性。底层是 lock cmpxchg 指令(X.原创 2021-08-25 11:44:05 · 880 阅读 · 0 评论 -
JUC Reentrantlock原理
AQS是什么?AbstractQueuedSynchronizer,是一个抽象类,称之为同步器,分为sync,fairsync和nofairsync。是lock式锁加锁和解锁真正用到的框架。特点?1、AQS中用 state 属性来表示是否上锁,在Reentrantlock中0表示没有上锁,大于0表示重入了几次锁。在ReentrantReadWriteLock中state分为读状态和写状态2、提供了基于 FIFO 的虚拟队列,类似于 Monitor 的 EntryList3、内..原创 2021-08-25 11:43:32 · 102 阅读 · 0 评论 -
JUC 读写锁原理
读写锁当前线程获取读锁后,自身线程可以获取读锁不能获取写锁,其他线程可以获取读锁不能获取写锁,尝试获取锁的线程会进入阻塞队列,直到读锁释放。当前线程获取写锁后,自身线程可以获取读锁和写锁,其他线程不可以获取读锁和写锁。尝试获取锁的线程会阻塞,直到写锁释放。锁降级先获取写锁,再获取读锁,在读锁中把写锁释放,称为锁降级state读写状态和写状态和读状态读写锁的state高16位存放读状态,即每获取一次读锁,高16位加1,即加的是0x00010000,低16位写状态,即每...原创 2021-08-25 11:42:14 · 189 阅读 · 0 评论 -
JUC StampedLock
StampedLock当前线程获取读锁后,自身线程不能获取写锁,其他线程可以获取读锁不能获取写锁,尝试获取锁的线程会进入阻塞队列,直到读锁释放。当前线程获取写锁后,自身线程可以获取读锁,其他线程不可以获取读锁和写锁。尝试获取锁的线程会阻塞,直到写锁释放。使用StampedLock的原因?采用乐观读,能进一步优化读性能。它的特点是在使用读锁、写锁时都必须配合印章使用 StampedLock的缺点:不支持可重入;不支持条件变量StampedLock的使用过程在执...原创 2021-08-25 11:41:07 · 92 阅读 · 0 评论