![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发知识
文章平均质量分 74
Java并发知识
飞鸟的心情
方法+努力。
展开
-
并发容器(三)BlockigQueue
2.LinkedBlockingQueue 底层是由链表实现的,锁的粒度更细,但是占用的内存更大。1.ArrayBlockingQueue是最简单的一种阻塞队列,底层是由数组实现。3.SynchronousQueue这是一个很有意思的队列,不存储数据。当移除元素的时候takeLock和putLock一起加。* 每个put 必须等待一个 take, 反之亦然。* 更像是一手交钱,一手交货。原创 2023-07-11 09:09:19 · 64 阅读 · 0 评论 -
学习Spring之声明式事务
事务底层是用AOP实现的,加上@Transactional注解之后,会依据动态代理创建一个子类,进而会将这个方法作为切入点,切面就是之前编程式事务的内容,在要执行的方法前后加上事务的逻辑commit和rollback,设计到了跨方法,将conn放入ThreadLocal中。可重复读 repeatable read (其实是上了一个行锁)事务1开始了还没结束 ,读取表数据,这时候事务2修改了表数据并且已经提交,那么事务1在这个事务中是查不到的,但是事务1能查询到事务2已经提交的增加的数据,这就是幻影读。原创 2023-06-21 14:13:51 · 557 阅读 · 0 评论 -
学习AQS
JUC包中 的很多同步器如ReentrantLock、Semaphore、CountDownLatch等等都是有一些基础的共同的行为,比如:等待队列、条件队列、独占获取、共享获取等等,这些抽象行为就被封装成一个抽象类,就是AbstractQueuedSynchronizer(抽象队列同步器)。一般是通过一个内部类Sync继承 AQS将同步器所有调用都映射到Sync对应的方法看图,抽象类AbstractQueuedSynchronizer的实现类几乎都是各种我们常见的JUC工具类中的内部类——各种Sync。原创 2023-06-26 09:34:45 · 320 阅读 · 0 评论 -
用synchronized实现一个简单的生产者和消费者
2)如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件。3)通知所有等待在对象上的线程。3)条件满足则执行对应的逻辑。等待方遵循如下原则。通知方遵循如下原则。原创 2023-06-25 13:05:00 · 108 阅读 · 0 评论 -
复习并发编程的基础知识(一)
我们在启动一个java进程的时候,main()是主线程,在main()方法中又启动了子线程,当主线程运行结束了不意味着进程就结束了,所有线程结束了进程才结束。如下图程序中,当运行该程序的时候,控制台输入jconsole,可以查看线程的情况,当main()方法执行完成之后会退出,Thread-0会继续执行。底层是调用了start0()方法,这个方法是native方法,即本地方法,底层是C或者C++实现的,是JVM来调用的,真正实现了多线程。守护线程服务于用户线程,当用户线程结束的时候,守护线程也结束了。原创 2023-06-12 20:06:09 · 487 阅读 · 0 评论 -
ReentrantLock实现生产者和消费者
java.util.concurrent类库中提供Condition类来实现线程之间的协调。调用Condition.await() 方法使线程等待,其他线程调用Condition.signal() 或 Condition.signalAll() 方法唤醒等待的线程。注意:调用Condition的await()和signal()方法,都必须在lock保护之内。原创 2023-06-25 13:37:36 · 102 阅读 · 0 评论 -
Mybatis多表关联查询
用了MybatisPlus之后,感觉自己写sql的机会不多,但是一些多表关联还是需要自己写的。今天复习一下mybatis中的多表关联查询建两个简单的表:emp员工表dept部门表员工:部门=多:1部门:员工=1:多如果项目中有多对多的关系,需要引入中间表,比如rbac中的用户角色表就是多对多的关系。原创 2023-06-20 23:55:56 · 7510 阅读 · 0 评论 -
复习并发编程的基础知识(二)
同步:一些敏感的数据(比如共享的需要修改的资源)不允许被多个线程同时访问,此时就是用同步访问技术,保证数据在任何同一时刻,最多有一个线程可以访问,以保证数据的完整性。但是sleep()和yield()方法都不会释放锁资源。2.Runnable(Ready和Running)正常情况下,run方法执行结束了就会释放锁。两种方式:1,同步代码块的方式。wait()方法也会释放锁。原创 2023-06-12 21:35:49 · 446 阅读 · 0 评论 -
复习并发编程的基础知识之线程池及线程池的核心线程数设置
workQueue:the queue to use for holding tasks before they are executed.这个队列用于存放任务,什么样的任务呢?在这些任务被执行之前的任务。也就是说,任务没执行的时候都放在这个阻塞队列中。unit:和keepAliveTime成对出现,存活时间的单位。其中线程池的几个重要参数是面试中经常被问的内容。threadFactory:线程工厂。线程池中的线程对象–》银行的服务窗口。在java中我们在使用线程池的时候,handler:拒绝策略。原创 2023-06-15 09:25:56 · 1962 阅读 · 2 评论 -
深入学习单例设计模式
保证一个类只有一个实例,并且提供一个全局访问点使用的场景:重量级的对象、不需要多个实例,及我们想复用的对象,如线程池,数据库连接池等 等。Spring中的IOC容器是单例对象,JDK的Runtime也是单例对象。原创 2023-06-28 11:10:37 · 522 阅读 · 0 评论 -
导致JVM内存泄露的ThreadLocal详解
多个线程共同操作一个共享变量,一定会引发并发问题,那么解决的方法就是对代码进行同步,比如synchronized关键字,但是ThreadLocal换了一种思路:让每个线程都拥有共享变量的副本,这样就不会引发多线程并发问题了。类中有一个静态内部类ThreadLocalMap,这个Map就是用来存储线程局部变量数据的,底层是一个Entry的数组,注意这个Entry的键 是一个弱引用,而且键类型是。虚拟机栈中的栈帧会不断的出栈,而且当一个任务运行结束后,虚拟机栈会销毁, 那么下图中的引用就没有了。原创 2023-06-21 17:46:38 · 1405 阅读 · 1 评论