随笔分类 -  java 并发编程

摘要:volatile可以保证可见性和有序性,具体分析见https://www.cnblogs.com/BonnieWss/p/12198101.html 场景1:原子操作 int a=0;//语句1int b=0;//语句2volatile int c=0;//语句3int d=0;//语句4int e 阅读全文
posted @ 2020-01-15 19:54 第二人生Bonnie 阅读(121) 评论(0) 推荐(0)
摘要:并发编程的三大特性 1、原子性 对于成员变量a来说,如果线程A执行以下操作: a++; 此时需要分三步执行: (1)读取a的值 (2)将a的值加1 (3)将加1后的值赋给a 在执行以上三步过程中,如果另一个线程B对a进行了操作,那么就不能保证原子性了。 要保证原子性,可以加锁,如synchroniz 阅读全文
posted @ 2020-01-15 18:06 第二人生Bonnie 阅读(2169) 评论(0) 推荐(0)
摘要:有两点需要注意:(1)当有一个线程抛出异常时,不会影响其他线程(2)在单元测试中,主线程结束时,也会结束子线程,所以要用CountDownLatch类,调用await(),等待其他子线程执行完毕。 @Test public void test(){ for(int i=0;i<threadCount 阅读全文
posted @ 2019-12-06 14:35 第二人生Bonnie 阅读(502) 评论(0) 推荐(0)
摘要:悲观锁抢红包过程:(思路) 1、检查红包是否有剩余,如果红包剩余数量大于0,用mysql悲观锁for update行锁,锁住查询的红包。 2、将红包剩余数量减1。 3、生成客户的红包数据,释放锁。 阅读全文
posted @ 2019-08-27 14:01 第二人生Bonnie 阅读(322) 评论(0) 推荐(0)
摘要:1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2永远被阻塞了。导致了死锁。这是最容易理解也是最简单的死锁的形式。但是实际环境中的死锁往往比这个复杂的 阅读全文
posted @ 2019-03-12 11:12 第二人生Bonnie 阅读(141) 评论(0) 推荐(0)
摘要:1、创建线程: 2、实现同步 结果: 由于没有实现同步,出现了num为负数的情况。 3、生产者和消费者 生产者: 消费者: 测试: wait():执行该方法的线程对象,释放同步锁,JVM会把该线程放到等待池中,等待其他线程唤醒该线程 notify():执行该方法的线程唤醒在等待池中等待的任意一个线程 阅读全文
posted @ 2019-03-12 11:12 第二人生Bonnie 阅读(194) 评论(0) 推荐(0)