多线程系列文章
结合项目进行输出
二缺和傻宝宝
互相学习
展开
-
ThreadLocal对request和response的使用
记得在一篇博文中看到描述threadLocal的一句话:ThreadLocal除了适用于多线程保证每条线程都有自己的变量副本外,还适用于在线程上下文中共享某些变量值。这两种说法是有区别的。前者强调的是,使用ThreadLocal对副本做保护,避免同步、加锁,降低效率;后者强调的是,某个变量线程上下文中,A处用到、B处用到、C处用到,先在入口处set一个值,后使用ThreadLocal的ge原创 2020-04-05 14:17:47 · 5024 阅读 · 4 评论 -
锁的两个基本工具—synchronized和Lock
1.ReentrantLock与synchronized有相同的并发性和内存语义,还包含了中断锁等候和定时锁等候,意味着线程A如果先获得了对象obj的锁,那么线程B可以在等待指定时间内依然无法获取锁,那么就会自动放弃该锁。2.但是由于synchronized是在JVM层面实现的,因此系统可以监控锁的释放与否,而ReentrantLock使用代码实现的,系统无法自动释放锁,需要在代码中fin原创 2018-01-08 15:17:08 · 441 阅读 · 0 评论 -
读写锁ReentrantReadWriteLock学习
在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写(译者注:也就是说:读-读能共存,读-写不能共存,写-写不能共存)。这就需要一个读/写锁来解决这个问题。Java5在java.util.concurrent包中已经包含了读写锁。还有一点,读写锁的运用,不一定是写一个才读一原创 2018-01-15 09:38:52 · 224 阅读 · 0 评论 -
volatile与synchronized区别
仅靠volatile不能保证线程的安全性。(原子性)1.volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法2.volatile防止重排序。要理解这个问题,先要了解对象的构造过程,实例化一个对象其实可以分为三个步骤:(1)分配内存空间。(2)初始化对象。(3)将内存空间的地址赋值给对应的引用。但是由于操作系统可以对指令进行重排序,所以上面的原创 2018-01-05 10:46:47 · 263 阅读 · 0 评论 -
多线程有三大特性和Java内存模型
三大特性: 原子性、可见性、有序性什么是原子性即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能保证不出现一些意外的问题。我们操作数据也是如此,比如i = i+1原创 2018-01-04 11:53:26 · 458 阅读 · 0 评论 -
重入锁学习—synchronized和ReentrantLock
锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利。重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。在JAVA环境下 ReentrantLock 和synchronized都是可重入锁。看下代码实例:原创 2018-01-13 12:41:25 · 319 阅读 · 0 评论 -
synchronized—生产者与消费者线程实例分析
先看几个概念,实例里边主要是通过wait和notify来实现的。 wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。 这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。 如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。 如果对象调用了noti原创 2018-01-08 11:21:09 · 183 阅读 · 0 评论 -
线程池学习
1.什么是线程池Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统原创 2018-01-12 18:20:19 · 180 阅读 · 0 评论 -
死锁案例分析
死锁的产生以及解决办法,看代码分析,注意里边的注释,自行运行。package thread;/** * 模拟买票 * * @author yhl * */class Thread02 implements Runnable{ private static int countTraket = 100; public boolean flag = true; pri原创 2018-01-03 23:16:28 · 266 阅读 · 0 评论 -
BlockingQueue—生产者消费者实例
在看实例代码之前,先普及一点相关的知识点:BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种:1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空队原创 2018-01-11 21:57:41 · 462 阅读 · 0 评论