thread
重生之我是一名程序员
IN IT && WIN IT !
展开
-
PC问题中wait使用if还是while修饰
PC问题中wait使用if还是while修饰情景:多线程中生产者消费者问题中对临界区(critical section)资源有等待的过程,会调用wait()方法等待其他线程释放锁的过程,使用while修饰,而不是使用if来修饰如: while (queue.peek() == null) { wait();}queue.remove();//而不是使用ifif ...转载 2018-04-05 15:13:40 · 967 阅读 · 0 评论 -
Redission 使用
Redission 使用public class RdisCounter implements Runnable { private RedissonClient redissonClient; private Acounter acounter; private CountDownLatch latch; public RdisCounter(RedissonClient redissonClient, Acounter acounter, CountDownL转载 2022-05-30 15:44:10 · 717 阅读 · 0 评论 -
使用DelayQueue
使用DelayQueue延迟任务业务场景:定单到期自动失效,并向用发送短信或者微信消息模板缓存失效解决这类业务也有其他方案: spring + quartz: 每隔几秒钟就去扫描数据库中失效的记录spring + redis (keyspace notification)缺点:在单机上是一种不错的选择,但在分布式环境下需要自己实现同步,不如quartz数据...转载 2018-04-06 11:08:29 · 376 阅读 · 0 评论 -
ThreadPoolTaskExecutor配置问题
ThreadPoolTaskExecutor配置问题最近线上出现一个奇葩问题,使用的是ThreadPoolTaskExecutor来处理后续服务调用,刚开始运行ThreadPoolTaskExecutor处理后续服务调用是没有问题的,但是一段时间之后,发现后续服务一直没有被调用,导致了极其严重的后果有关spring中ThreadPoolTaskExecutor具体如下: <...转载 2018-07-10 08:47:46 · 11046 阅读 · 0 评论 -
synchronized和volatile区别
synchronized和volatile区别摘自《Java多线程编程核心技术》关于synchronized和volatile的比较:关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且只能修改变量,而synchronized可以修饰方法,以及代码块。多线程访问volatile不会发生阻塞,而synchronized会出现阻塞v...转载 2019-01-01 15:48:31 · 818 阅读 · 1 评论 -
了解阻塞队列
了解阻塞队列摘自《java并发编程艺术》 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加操作支持阻塞的插入各移除的方法支持阻塞插入的方法: 当队列满时,队列会阻塞插入的线程,直到队列不满支持阻塞移除的方法: 当队列为空时,获取元素的线程会等待队列变成非空ArrayBlockingQueue ArrayBlockingQueue...转载 2018-04-05 21:22:36 · 151 阅读 · 0 评论 -
volatile关键字
valotile关键字当一个变量定义为valotile之后,就保证了此变量对所有线程的可见性,可见性是指:当一个线程改变了这个变量之后,新值对于其他线程来说是可以被立即感知的。在读取一个volatile字段之前,各线程中缓冲区必须失效,因为值是存在于主存中而不是各线程中缓冲区。而普通变量不能做到这一点,普通变量的值在线程间传递需要通过主内存来完成。如:线程A修改了一个普通变量的值,然后向主内存...转载 2018-03-29 09:03:04 · 144 阅读 · 0 评论 -
CAS导致的ABA问题
CAS(Compare And Swap)导致的ABA问题问题描述 多线程情况下,每个线程使用CAS操作欲将数据A修改成B,当然我们只希望只有一个线程能够正确的修改数据,并且只修改一次。当并发的时候,其中一个线程已经将A成功的改成了B,但是在线程并发调度过程中尚未被调度,在这个期间,另外一个线程(不在并发中的请求线程)将B又修改成了A,那么原来并发中的线程又可以通过CAS操作将A改成B...转载 2018-04-02 09:04:15 · 1157 阅读 · 0 评论 -
synchronized死锁问题
synchronized死锁问题死锁产生: 线程A持有资源r1的锁,等待获取资源r2;线程B持有资源r2的锁,等待获取资源r1;线程A不愿意放弃资源r1的锁,而线程B也不愿意放弃资源r2的锁调试用例:public class DeadSynThread implements Runnable { private byte[] lock1 = new byte[0]; ...转载 2018-03-31 23:23:59 · 492 阅读 · 0 评论 -
synchronized锁重入
synchronized锁重入关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁之后,再次请求此对象锁是可以再次得到该对象的锁的。这也说明一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的 重入锁: 自己可以再次获取自己内部锁测试用例:public c...转载 2018-03-31 22:33:47 · 234 阅读 · 0 评论 -
DelayQueue源码
DelayQueue源码DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队 列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。 只有在延迟期满时才能从队列中提取元素public class DelayQueue<E extends Delayed> extends AbstractQu...转载 2018-04-07 22:21:08 · 264 阅读 · 0 评论 -
了解线程池
线程池实现原理了解线程池的实现原理,先了解线程池工作流程,就基于JDK中Executor框架中的ThreadPoolExecutor来看处理流程首先,看下ThreadPoolExecutor的构造函数:public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long k...转载 2018-04-07 15:57:22 · 130 阅读 · 0 评论 -
JMM和JVM内存模型
JMM和JVM内存模型原作者博客: Java Memory Model JVM内存模型JVM内存模型中包括:程序计数器(PC)java虚拟机栈本地方法栈java堆方法区程序计数器(PC) 程序计数器是一块很小的内存空间,用于记录下一条要运行的指令。每个线程都需要一个程序计数器,各个线程之中的计数器相互独立,是线程中私有的内存空间java虚拟机...翻译 2018-03-24 21:08:52 · 27076 阅读 · 7 评论 -
threadlocal关键字
ThreadLocal关键字线程局部变量,只有当前线程可以访问。既然只有当前线程可以访问,自然是线程安全的 ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread(ThreadLocal实例通常是一个类中的私有的属性pr...转载 2018-03-30 08:53:48 · 385 阅读 · 0 评论 -
生产者消费者问题(notify和wait)
使用notify和wait机制实现生产者和消费者设计:产品: Product类产品库: ProductRepository类生产者线程消费者线程Product.java: public class Product { private String name; private long productNo; public Product(S...转载 2018-03-23 14:51:22 · 3820 阅读 · 2 评论 -
线程中断机制
线程中断机制public static native void sleep(long millis) throws InterruptedException if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when th...转载 2018-03-23 09:02:33 · 178 阅读 · 0 评论