![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程开发
文章平均质量分 73
多线程开发
@Autowire
这个作者很懒,什么都没留下…
展开
-
探讨并发编程的三大特性:原子性、可见性、有序性
神仙姐姐带你了解并发的三大特性!!!撸起袖子干吧!!!!!1 Java内存模型Java内存模型(Java Memory Model,简称JMM),了解了Java内存模型以后,可以更好地理解三大特性。Java内存模型是一种抽象的概念,并不是真实存在的,它描述的是一组规范或者规定。JVM运行程序的实体是线程,每一个线程都有自己私有的工作内存。Java内存模型中规定了所有变量都存储在主内存中,主内存是一块共享内存区域,所有线程都可以访问。但是线程对变量的读取赋值等操作必须在自己的工作内存中进行,在操作之前先.转载 2022-03-26 10:05:19 · 221 阅读 · 0 评论 -
Thread.sleep()【针对于当前线程的睡眠】
1 Thread.sleep()使当前执行的线程在指定的毫秒数内休眠(暂时停止执行),这取决于系统计时器和调度程序的精度和准确性,线程不会丢失任何监视器的所有权。public class TestThreadSleep { public static void main(String[] args) { System.out.println("Main thread begin time = " + System.currentTimeMillis()); MyT原创 2020-11-11 15:22:34 · 2040 阅读 · 0 评论 -
请你谈一谈对线程模型的理解?
在Java中,我们平时所说的并发编程、多线程、共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫作“用户线程”,而对应到操作系统,还有另外一种线程叫作“内核线程”。用户线程位于内核之上,它的管理无需内核支持;而内核线程由操作系统来直接支持与管理。几乎所有的现代操作系统,包括 Windows、Linux、Mac OS X 和 Solaris,都支持内核线程。最终,用户线程和内核线程之间必然存在某种关系:多对一模型、一对一模型和多对多模型。1 多对一模型多个用户级线程映射到一个内核线程,线程管理原创 2021-08-25 08:42:55 · 576 阅读 · 0 评论 -
请你谈谈多线程基本知识点?
上述的图有些简略,下面详细说明下,线程共有6种状态:new,runnable,blocked,waiting,timed waiting,terminated1,当进入synchronized同步代码块或同步方法时,且没有获取到锁,线程就进入了blocked状态,直到锁被释放,重新进入runnable状态2,当线程调用wait()或者join时,线程都会进入到waiting状态,当调用notify或notifyAll时,或者join的线程执行结束后,会进入runnable状态3,当线程调用slee.原创 2021-03-23 19:51:20 · 186 阅读 · 0 评论 -
请你谈谈多线程基本知识 - 线程死锁的理解?
1什么是死锁?死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。2形成死锁的四个必要条件是什么?1 互斥条件:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。2 请求与保持条件:一个线程(进程)因请求被占用资源而发生阻塞时,对已获得的资源保持不放。3 不剥夺条件:线程(进程)已获得的资源在末使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。4 循环等原创 2021-04-13 20:08:53 · 196 阅读 · 0 评论 -
请你谈谈多线程基本知识 - 乐观锁与悲观锁的适用场景
这种问题怎么解决了,也就是上面我们所说的版本号机制,加入版本号(版本号必须是顺序递增的)之后,判断版本,只有当版本号相同时才更改值,然后版本号+1;读完上面这一段,我们应该已经知道乐观锁的意思了,也就是说大部分乐观锁其实就是加了版本号version字段,根据这个字段实现的乐观锁机制,那么还有什么方式可以实现乐观锁呢,聪明的你肯定已经想到了CAS,对的,CAS(compare and swap)比较并修改,CAS需要三个参数,内存地址V,旧的预期值A和新值B,只有当V的值等于A时,才会将V的值改为B。原创 2023-08-24 09:39:14 · 124 阅读 · 0 评论 -
请你谈谈线程通信的方式?
1volatile 2等待/通知机制 3join方式 4threadLocal1volatile的理解volatile的理解2等待/通知机制的理解等待通知机制 是基于wait和notify方法来实现的,在一个线程内调用该线程锁对象的wait方法,线程将进入等待队列进行等待直到被通知或者被唤醒。对于wait()和notify()的理解,还是要从jdk官方文档中开始,在Object类方法中有:void notify() :唤醒在此对象监视器上等待的单个线程。void notifyAll() :唤醒原创 2021-04-17 11:02:04 · 82 阅读 · 0 评论 -
请你谈谈i++ 线程安全问题?
1 CAS : compareAndSet 比较并交换1什么是CAS?三个值:实际值+期望值+更新值import java.util.concurrent.atomic.AtomicInteger;public class casDemo { //CAS : compareAndSet 比较并交换 public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInt原创 2021-02-28 15:44:52 · 708 阅读 · 2 评论 -
生产者消费者模式:使用Object.wait() / notify()方法实现
它描述是有一块缓冲区(队列实现)作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。在Java中这个多线程线程同步阻塞的问题,多个用户同时发送多个请求,怎么保证不发生线程死锁,是我们要考虑的问题。生产者消费者模式说明:1.生产者只在仓库未满时进行生产,仓库满时生产者进程被阻塞;2.消费者只在仓库非空时进行消费,仓库为空时消费者进程被阻塞;3.当消费者发现仓库为空时会通知生产者生产;3.当生产者发现仓库满时会通知消费者消费;生产者消费者问题就是要保证不会出现没有商品但是消费者还是一直原创 2022-03-24 15:05:34 · 411 阅读 · 0 评论 -
请你谈谈多线程基本知识 - synchronized关键字?
1 synchronized同步方法“非线程安全” 其实会在多个线程对同一对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”。1.1 方法内的变量为线程安全public class Run { public static void main(String[] args) { HasSelfPrivateNum hasSelfPrivateNum = new HasSelfPrivateNum(); MyThread1 thread1 = new MyTh原创 2020-11-10 16:43:31 · 282 阅读 · 1 评论 -
请你谈谈多线程基本知识 - ReentrantLock的特性的理解?
1 ReentrantLock可重入同一个线程,如果首次获取到该锁资源,则它就有权力再次获取到该锁,这就是锁的重入。package com.zs.thread;import java.util.concurrent.locks.ReentrantLock;public class LockInterruptibly { private static ReentrantLock lock = new ReentrantLock(); public static void main(原创 2022-03-24 18:07:56 · 359 阅读 · 0 评论 -
深入探讨AbstractQueuedSynchronizer(AQS)的源码世界
AbstractQueuedSynchronizer抽象同步队列简称A Q S,它是实现同步器的基础组件,如常用的ReentrantLock、Semaphore、CountDownLatch等。A Q S定义了一套多线程访问共享资源的同步模板,解决了实现同步器时涉及的大量细节问题,能够极大地减少实现工作。三部分组成:state同步状态、Node组成的CLH队列、ConditionObject条件变量(包含Node组成的条件单向队列)。1 AbstractQueuedSynchronizer提供的核心函转载 2022-03-25 10:26:48 · 108 阅读 · 0 评论 -
深入探讨ReentrantLock的趣味世界
ReentrantLock底层基于AbstractQueuedSynchronizer实现:首先ReentrantLock实现了Lock接口,Lock接口是Java中对锁操作行为的统一规范,Lock接口的定义如下:public interface Lock { // 获取锁 void lock(); // 获取锁-响应中断 void lockInterruptibly() throws InterruptedException; // 返回获取锁是否成功状态转载 2022-03-25 13:06:48 · 97 阅读 · 0 评论 -
请你谈谈Synchronized 和 ReenTrantLock 的对比?
1 两者都是可重入锁两者都是可重入锁。“可重入锁”概念是:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。2 synchronized依赖于JVM而ReenTrantLock依赖于APIsynchronized是依赖于JVM实现的,前面我们也讲到了 虚拟机团队在JDK1.6为synchronize转载 2021-04-14 16:07:30 · 219 阅读 · 0 评论 -
浅谈ReentrantReadWriteLock的基本使用
神仙姐姐问题问题,你能答出来吗!!!ReentrantLock具有完全互斥排它的效果,即同一时间只有一个线程在执行ReentrantLock.lock()方法后面得任务。这样做虽然保证了实例变量的线程安全性,但效率却是非常差。所以在JDK中提供了一种读写锁ReentrantReadWriteLock类,使用它可以加快运行效率,在某些不需要操作实例变量得方法中,完全可以使用读写锁ReentrantReadWriteLock来提升该方法的代码运行速度。读写锁表示也有两个锁,一个是读写操作相关的锁,也称为共.原创 2022-03-26 10:41:13 · 161 阅读 · 0 评论 -
从源码角度深入了解ReentrantReadWriteLock的基本原理
神仙姐姐带你撸源码,讲原理。come on!!!!!!public interface ReadWriteLock { Lock readLock(); Lock writeLock();}1 读锁与写锁那么WriteLock与ReadLock对Lock接口具体是如何实现的呢?2 AQSAQS(AbstractQueuedSynchronizer)抽象类定义了一套多线程访问共享资源的同步模板,解决了实现同步器时涉及的大量细节问题,能够极大地减少实现工作,用大白话来说,AQS.转载 2022-03-27 08:47:06 · 157 阅读 · 0 评论 -
请你谈一下对C A S 的理解?
1 C A S基本概念C A S(compareAndSwap)也叫比较交换,是一种无锁原子算法,映射到操作系统就是一条cmpxchg硬件汇编指令(保证原子性),其作用是让C P U将内存值更新为新值,但是有个条件,内存值必须与期望值相同,并且C A S操作无需用户态与内核态切换,直接在用户态对内存进行读写操作(意味着不会阻塞/线程上下文切换)。java.util.concurrent.atomic 包下的类大多是使用 CAS 操作来实现的(AtomicInteger,AtomicBoolean,Ato转载 2022-03-25 14:50:31 · 368 阅读 · 0 评论 -
请你谈谈volatile的理解?
1 JMM1对Volatile 的理解Volatile 是 Java 虚拟机提供 轻量级的同步机制1、保证可见性2、不保证原子性3、禁止指令重排如何实现可见性volatile变量修饰的共享变量在进行写操作的时候回多出一行汇编:0x01a3de1d:movb $0×0,0×1104800(%esi);0x01a3de24**:lock** addl $0×0,(%esp);Lock前缀的指令在多核处理器下会引发两件事情。1)将当前处理器缓存行的数据写回到系统内存。2)这个写回内存的操作会转载 2021-02-28 09:17:19 · 539 阅读 · 0 评论 -
请你谈谈多线程中静态变量、实例变量、局部变量?
静态变量(类变量)为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。实例变量属于创建对象,存储在堆内存中,若系统中只存在一个该类的对象,在多线程环境下,该对象被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在该类的不同对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。局部变量在每个线程执行时,被存放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。即在每个线程都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影原创 2020-11-13 09:25:11 · 712 阅读 · 0 评论 -
请你谈谈对ThreadLocal的理解?
1理解Java的强引用、软引用、弱引用和虚引用1强引用(StrongReference)强引用是使用最普遍的引用,如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 如果强引用对象不使用时,需要弱化从而使GC能够回收,如下: strongReference = null;方法的内部使用强引用:这个引用保存在Java栈中,而真正的引用内容(Obj原创 2021-08-02 10:08:05 · 194 阅读 · 0 评论 -
ThreadLocal的应用案例详解
通过以上代码可以看到,在Hibernate的getSession()方法中,首先判断当前线程中有没有放进去Session,如果还没有,那么通过sessionFactory().openSession()来创建一个Session,再将Session设置到ThreadLocal变量中,这个Session相当于线程的私有变量,而不是所有线程共用的,显然其他线程中是取不到这个Session的。使用ThreadLocal保存函数之间需要传递的数据,在需要的地方直接获取,也能避免通过参数传递数据带来的高耦合。原创 2023-08-24 14:24:39 · 291 阅读 · 0 评论 -
请你谈谈CountDownLatch的理解?
1ReentrantLock底层数据结构Reetrantlock是一个可以重复获得锁的一个互斥锁,它的加锁与解锁都是需要手动执行,也可以多次加锁,同时它还可以指定是由公平锁还是非公平锁实现。public ReentrantLock() { sync = new NonfairSync(); }public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync();原创 2021-03-29 18:39:17 · 202 阅读 · 1 评论 -
请你谈谈对Semaphore的理解?
Semaphore:信号量,semaphore.acquire()获得资源,如果资源已经使用完了,就等待资源释放后再进行使用。semaphore.release()释放,会将当前的信号量释放+1,然后唤醒等待的线程。ReentrantReadWriteLock:读写锁,支持共享方式多个线程同时获取资源,也支持排他方式只能有一个线程能够获取,用读锁的时候表示支持其他读锁访问,写锁的时候就只允许一个线程访问;...转载 2022-03-25 16:26:02 · 111 阅读 · 0 评论 -
请你谈谈CyclicBarrier的理解?
你的产品经理来了 ,快去写代码!!!!1 CyclicBarrier 案例引入CyclicBarrier是一种同步辅助工具,字面意思就是循环栅栏,它允许一组线程在一个共同的屏障点彼此等待,所有线程到达屏障点后再全部同时执行。固定数量的线程在程序中必须彼此等待的时候,CyclicBarrier非常有用。循环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。张三、李四、王五三个人约好去饭店一起去吃饭,等到所有人到了饭店以后再一起吃饭,然后等到所有人都吃完以后再一起离开餐厅。pac.转载 2022-03-26 08:35:43 · 97 阅读 · 0 评论 -
举例介绍ForkJoin(拆分&&合并 把大任务拆分为小任务)
1ForkJoinForkJoin 在JDK1.7,并行执行任务!提高效率。在大数据量速率会更快!大数据中:MapReduce 核心思想->把大任务拆分为小任务!1ForkJoin 特点: 工作窃取!实现原理是:双端队列!从上面和下面都可以去拿到任务进行执行!2如何使用ForkJoin?ForkJoin 的计算类public class Test { public static void main(String[] args) { // 传统的程序员写法原创 2021-02-27 19:25:51 · 464 阅读 · 0 评论