![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程与高并发学习
文章平均质量分 64
多线程与高并发学习
软软的铲屎官
这个作者很懒,什么都没留下…
展开
-
并发锁及其原理
==== =锁= ====1、Synchronized原理是什么? Synchronized 是由JVM实现的一种实现互斥同步的锁 ,被 Synchronized修饰过的程序 块,在编译前后被编译器生成了monitorenter和monitorexit两个字节码指令。 虚拟机执行到monitorenter指令时, 尝试获取对象的锁:如果这个对象没有锁定, 或者当前线程 已经拥有了这对象的锁,把锁的计数器 +1;当执行monitorexit指令时将锁计数器-1;当计数器为 0时,锁就被释原创 2021-04-20 17:37:18 · 167 阅读 · 0 评论 -
多线程笔记
==== =多线程= ====1、创建线程有四种方式: 继承 Thread 类;实现 Runnable 接口;实现 Callable 接口; 使用 Executors 工具类创建线程池继承 Thread 类2、线程的 run()和 start()有什么区别? 1)start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。 2)run() 可以重复调用,而 start() 只能调用一次。 3)调用start()方法无需等待 run方法体代码执行完,可以继续执行其他的代码;此原创 2021-04-20 10:22:28 · 95 阅读 · 0 评论 -
各种JUC同步锁:CountDownLatch、CyclicBarrier、MarriagePhaser、ReadWriteLock、Semaphore、Exchanger、LockSupport
1、CountDownLatchCountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。CountDownLatch的用法原创 2020-12-09 08:25:19 · 287 阅读 · 0 评论 -
可重入锁ReentrantLock及其他显式锁相关问题
1、跟Synchronized相比,可重入锁ReentrantLock其实现原理有什么不同?其实,锁的实现原理基本是为了达到一个目的:让所有的线程都能看到某种标记。Synchronized通过在对象头中设置标记实现了这一目的,是一种JVM原生的锁实现方式,而ReentrantLock以及所有的基于Lock接口的实现类,都是通过用一个volitile修饰的int型变量,并保证每个线程都能拥有对该int的可见性和原子修改,其本质是基于所谓的AQS框架。2、 AQS框架是怎么回事儿?AQS(Abstrac原创 2020-12-08 08:56:34 · 105 阅读 · 0 评论 -
Synchronized相关问题
1、Synchronized原理是什么?Synchronized 是由JVM实现的一种实现互斥同步的一种方式 ,被 Synchronized修饰过的程序块,在编译前后被编译器生成了monitorenter和monitorexit两个字节码指令。在虚拟机执行到monitorenter指令时, 首先要尝试获取对象的锁:如果这个对象没有锁定, 或者当前线程已经拥有了这对象的锁,把锁的计数器 +1;当执行monitorexit指令时将锁计数器-1;当计数器为0时,锁就被释放了 。如果获取对象失败了,那当前线程就原创 2020-12-07 15:42:27 · 148 阅读 · 0 评论 -
可重入锁ReentrantLock学习记录
1、ReentrantLock是一种可重入锁,可以替代synchronized子类和父类如果都是synchronized(this)就是同一把锁。sync实现:public class Thread_007_ReentrantLock { public static void main(String[] args) { Thread_007_ReentrantLock thread007ReentrantLock = new Thread_007_ReentrantLock()原创 2020-12-05 20:33:35 · 103 阅读 · 0 评论 -
volatile与synchronized的区别学习记录
volatile与synchronized的区别1、volatile只能修饰实例变量和类变量,而synchronized可以修饰方法,以及代码块。2、volatile保证数据的可见性,但是不保证原子性(多线程进行写操作,不保证线程安全);而synchronized是一种排他(互斥)的机制。 3、volatile用于禁止指令重排序:可以解决单例双重检查对象初始化代码执行乱序问题。 volatile可以看做是轻量版的synchronized,4、volatile不保证原子性,但是如果是对一个共享变量进行多原创 2020-12-04 17:17:25 · 166 阅读 · 0 评论 -
synchronized关键字,线程同步学习记录
synchronized底层实现:在JDK早期是重量级的;后来改进—>锁升级的概念;markWord记录这个线程的ID(偏向锁);如果线程争用:升级---->自旋锁(占用cpu)适用于时间段、数量少的线程;自旋锁触发10次以后升级为重量级锁---->os(不占用cpu);执行时间短,线程数少用自旋锁;执行时间长,线程数多用系统锁。1、程序执行过程中,如果出现异常,默认情况下锁被释放所以,在并发处理的过程中,有异常要多加小心,不然可能会发生不一致的情况。比如,在一个we原创 2020-12-03 09:05:08 · 63 阅读 · 0 评论 -
synchronized、AtomicInteger、LongAdder自增问题
1、在多线程中++i和i++是线程不安全的,解决方式:①、synchronized加锁修饰 ②、AtomicXXX ③、LongAdderAtomicXXX比synchronized效率高的原因是AtomicXXX是无锁的CAS操作;LongAdder比AtomicXXX效率高的原因是LongAdder是分段锁(分段锁也是无锁的CAS操作)public class Thread_006_SyncVsAtomicXXXVsLongAdder { static Long syncCount = 0原创 2020-12-03 09:04:41 · 183 阅读 · 0 评论 -
同步和非同步方法是否可以同时调用?
同步和非同步方法是否可以同时调用?当然可以调用如下代码public class Thread_001_Syncronized { public synchronized void m1() { System.out.println(Thread.currentThread().getName() + "---m1----start"); try { Thread.sleep(10000); } catch (Interrup原创 2020-12-02 14:47:05 · 170 阅读 · 0 评论 -
启动线程的三种方式
启动线程的三种方式:1、继承thread类 2、实现runnable接口 3、线程池Executors.newCachedThreadpublic class Thread_000_CreateFormThreadAndRunnable { public static void main(String[] args) { // 继承Thread类 new myThread().start(); // 实现Runnable接口 new原创 2020-12-02 10:14:55 · 268 阅读 · 1 评论 -
volatile关键字学习记录
volatile学习记录一、volatile关键字很重要的两个特性:二、非阻塞同步三、内存模型的相关概念四、并发编程中的三个概念五、使用volatile关键字的场景六、深入剖析volatile关键字一、volatile关键字很重要的两个特性:1、保证变量在线程间可见,对volatile变量所有的写操作都能立即反应到其他线程中,换句话说,volatile变量在各个线程中是一致的(得益于java内存模型—“先行发生原则”);2、禁止指令的重排序优化;二、非阻塞同步同步:多线程并发访问共享数据时,保证共原创 2020-12-01 11:46:25 · 82 阅读 · 0 评论