随笔分类 -  Java高并发与线程安全

摘要:第一题:现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象。原始代码如下: public class Test { ... 阅读全文
posted @ 2016-11-21 13:51 john8169 阅读(218) 评论(0) 推荐(0)
摘要:1. 简介在java.util.concurrent包的说明文档里有Executors/Queues/Timing/Synchronizers/Concurrent Collections整体介绍,一看便知传统集合类在并发访问时是有问题的,如HashMap并发访问时即... 阅读全文
posted @ 2016-11-21 10:45 john8169 阅读(265) 评论(0) 推荐(0)
摘要:ArrayBlockingQueue(jdk中已经提供 就在那个condition类说明里的可阻塞示例程序的下面就说明了)注意三个添加方法的区别->查API文档 拿插入来说 一个会抛异常 一个返回true/false 一个会阻塞是记不住的 找到doc即可 把精力留出来... 阅读全文
posted @ 2016-11-20 13:28 john8169 阅读(202) 评论(0) 推荐(0)
摘要:CyclicBarrier表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定地点集合碰面,这就好比整个公司的人员利用周末时间集体郊游一样,先各自从家出发到公司集合后,再同时出发到公园游玩,在指定地点集合后再同时开始就餐,… package javaplay.... 阅读全文
posted @ 2016-11-20 12:50 john8169 阅读(152) 评论(0) 推荐(0)
摘要:Semaphore这个东西和之前的synchronized干的事差不多。 synchronized保证了,我管理的那部分代码同一时刻只有一个线程能访问 Semaphore保证了,我管理的那部分代码同一时刻最多可以有n个线程访问 Semaphore可以维护当前访问自身的... 阅读全文
posted @ 2016-11-20 11:02 john8169 阅读(178) 评论(0) 推荐(0)
摘要:锁(Lock/synchronized)只能实现互斥不能实现通信,Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能,在等待Condition时,允许发生"虚假唤醒",这通常作为对基础平台语义的让步,对... 阅读全文
posted @ 2016-11-19 21:58 john8169 阅读(207) 评论(0) 推荐(0)
摘要:读写锁,分为读锁和写锁,多个读锁不互斥,读锁和写锁互斥,写锁与写锁互斥,这是JVM自己控制的,你只要上好相应的锁即可,如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁.总之,读的时候上... 阅读全文
posted @ 2016-11-19 10:51 john8169 阅读(166) 评论(0) 推荐(0)
摘要:Lock比传统线程模型中的Synchronied方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码段要实现同步互斥的效果,它们必须用同一个Lock对象,锁是在代表要操作的资源的类的内部方法中,而不是线程代码中.Lock就用来替代synchr... 阅读全文
posted @ 2016-11-19 10:03 john8169 阅读(132) 评论(0) 推荐(0)
摘要:示例: package javaplay.thread.test;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.CompletionSe... 阅读全文
posted @ 2016-11-19 09:28 john8169 阅读(128) 评论(0) 推荐(0)
摘要:应用示例如下: package javaplay.thread.test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.uti... 阅读全文
posted @ 2016-11-19 08:42 john8169 阅读(151) 评论(0) 推荐(0)
摘要:AtomicInteger 用得不当被笑掉大牙AtomicIntegerArrayAtomicIntegerFieldUpdater:对类中整数字段进行操作,需要先反射获取对象身上的字段即atomic包,可以对基本数据、对数组中的基本数据、对类中的基本数据等进行操作,... 阅读全文
posted @ 2016-11-18 23:02 john8169 阅读(121) 评论(0) 推荐(0)
摘要:示例: package javaplay.thread.test;import java.util.Random;public class ThreadLocalTest { // 相当于一个hashmap,数据是线程范围内的,一个线程一个数据,特别简单 static... 阅读全文
posted @ 2016-11-18 22:39 john8169 阅读(162) 评论(0) 推荐(0)
摘要:要实现线程范围内的数据共享,就是说不管是A模块还是B模块,如果它们现在在同一个线程上运行,它们操作的数据应该是同一个,下面的做法就不行: package javaplay.thread.test;import java.util.Random;public class... 阅读全文
posted @ 2016-11-18 20:22 john8169 阅读(315) 评论(0) 推荐(0)
摘要:wait和notify实例子线程循环10次,主线程循环100次。接着子线程循环10次,主线程循环100次。如此循环50次。摘自张孝祥老师线程视频源码。 package javaplay.thread.test;public class TraditionalThrea... 阅读全文
posted @ 2016-11-18 19:26 john8169 阅读(163) 评论(0) 推荐(0)
摘要:package javaplay.thread.test;public class TraditionalThreadSynchronized { public static void main(String[] args) { new TraditionalThr... 阅读全文
posted @ 2016-11-17 23:04 john8169 阅读(120) 评论(0) 推荐(0)
摘要:package javaplay.thread.test;import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class TraditionalTimerTes... 阅读全文
posted @ 2016-11-17 20:28 john8169 阅读(134) 评论(0) 推荐(0)
摘要:1.如果每个线程执行的代码相同,可以使用同一个Runable对象,这个Runable对象中有那个共享数据,例如卖票系统就可以这样做。 package javaplay.test;public class MulteThreadShareData { public st... 阅读全文
posted @ 2016-11-16 23:29 john8169 阅读(1378) 评论(0) 推荐(0)
摘要:package javaplay.thread.test;public class TraditionalThread { public static void main(String[] args) { // 第一种 Thread thread = new Th... 阅读全文
posted @ 2016-11-16 22:46 john8169 阅读(117) 评论(0) 推荐(0)