
Java并发编程
Java并发编程:包括synchronized、锁优化、volatile、Lock、原子类、线程池等
SenlAAA
这个作者很懒,什么都没留下…
展开
-
Java并发编程----synchronized和ReentrantLock
synchronized和ReentrantLock 的区别①都是可重⼊锁。即同一个线程可以多次获得锁如:⼀个线程获得了某个对象的锁,当锁还没有释放,它还是可以再次获得这个锁,不可重⼊锁则不行。②synchronized 依赖于 JVM 实现的,ReentrantLock 是 JDK 层⾯实现的(即依赖API,需要 lock() 和 unlock() ⽅法配合,try、finally 语句块完成。③ReentrantLock增加了⼀些⾼级功能,①等待可中断;②可实现公平锁;③选择性通知(锁可以绑定多原创 2021-01-06 15:26:08 · 228 阅读 · 0 评论 -
Java并发编程----ThreadLocal
ThreadLocal:为每个使用该变量的线程提供独立的副本,每个线程都可独立地改变自己的副本,而不影响其它线程的副本。Thread 类中内部有一个ThreadLocalMap 类型的变量,调⽤ThreadLocal 类的get、set⽅法,实际上是调⽤ ThreadLocalMap 类的get、set⽅法。最终的变量不是存在ThreadLocal上,而是存在当前线程的ThreadLocalMap中,ThrealLocal 类可以通过 Thread.currentThread() 获取当前线程对象后原创 2021-01-05 22:06:47 · 193 阅读 · 0 评论 -
Java并发编程----线程池
线程池的作用:通过重复利用已创建的线程,降低线程创建和销毁造成的消耗。提⾼响应速度。不需要等线程创建。提⾼线程的可管理性。线程池统⼀分配管理。创建线程池的方式有两种使用 Executors创建线程池用ThreadPoolExecutor创建不推荐使用 Executors创建线程池,要用ThreadPoolExecutor创建,因为ThreadPoolExecutor能指定线程池的重要参数。Executors 返回线程池对象的弊端:FixedThreadPool 和 SingleThre原创 2021-01-05 22:06:03 · 224 阅读 · 0 评论 -
Java并发编程----锁
JDK1.6 对锁的优化: 偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化 等技术。锁主要存在四中状态,依次是:无锁状态偏向锁状态轻量级锁状态重量级锁状态锁可以升级不可降级,即 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁是单向的。 这种策略是为了提高获得锁和释放锁的效率。偏向锁和轻量级锁的区别偏向锁和轻量级锁都是为了:在无多线程竞争时,减少重量级锁中使用操作系统互斥量的性能消耗。轻量级锁在无竞争时使用 CAS 代替互斥量。而偏向锁则把整个同步都消除。轻量级锁原创 2021-03-18 16:48:40 · 237 阅读 · 0 评论 -
Java并发编程----synchronized和 volatile 关键字的区别
Volatile:保证变量的可⻅性、防⽌指令重排Java 内存模型,线程可以把变量保存在本地内存(寄存器)中,而不是直接在主存中读写。可能造成⼀个线程在主存中修改了变量的值,而另外⼀线程使用变量在寄存器的拷贝,造成数据的不⼀致。变量声明为volatile,为了确保每次都到主存中进⾏读取。使用volatile前使用volatile后synchronized和volatile的区别volatile只能⽤于变量,⽽synchronized可以修饰⽅法、代码块。volatile主要解决变量在多线原创 2021-01-10 23:42:52 · 267 阅读 · 0 评论 -
Java并发编程----synchronized
Synchronized:解决多线程访问时,资源的同步性,可以保证⽅法、代码块在任意时刻只有⼀个线程执⾏。三种使⽤⽅式:修饰实例⽅法: 给对象实例加锁,进⼊同步代码前,要获得对象实例的锁修饰静态⽅法: 给类加锁,作⽤于类的所有对象实例,修饰代码块: 对指定代码块加锁,进⼊同步代码库前要获得 给定对象的锁。synchronized底层实现原理修饰同步语句块的实现使⽤的是 monitorenter 和 monitorexit 指令,其中monitorenter 指令指向同步代码块的开始位置,原创 2021-01-10 23:44:19 · 224 阅读 · 0 评论 -
Java并发编程----线程的简述
线程的⽣命周期和状态线程的状态有创建、就绪、运行、阻塞和死亡。第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态;第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,或者在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态第三是运行状态。处于就绪状态的线程获得CPU时间片就进入了运行状态,开始运行run函数当中的代码。第四是阻塞状态。线程正在运行时被暂停,sleep方法可以导致线程阻塞。第五是死亡状态。如果一个线程的run方法执原创 2021-01-05 23:20:00 · 218 阅读 · 0 评论 -
Java多线程----程序、进程和线程概述
程序是静态的,含有指令和数据的⽂件。进程是动态的,是程序的⼀次执⾏过程。线程是进程划分的更小单位。⼀个进程在执⾏过程中可以产⽣多个线程。在同一进程中,线程切换不会引起进程切换,但不用进程中的线程切换,会引起进程切换。创建或撤销进程时,系统都要为之分配或回收资源,涉及当前执行进程 的CPU 环境保存 和 新调度进程 的CPU 环境设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。...原创 2021-01-05 23:19:29 · 334 阅读 · 1 评论