摘要: Semaphore这个东西和之前的synchronized干的事差不多。 synchronized保证了,我管理的那部分代码同一时刻只有一个线程能访问 Semaphore保证了,我管理的那部分代码同一时刻最多可以有n个线程访问 Semaphore可以维护当前访问自身的... 阅读全文
posted @ 2016-11-20 11:02 john8169 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 锁(Lock/synchronized)只能实现互斥不能实现通信,Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能,在等待Condition时,允许发生"虚假唤醒",这通常作为对基础平台语义的让步,对... 阅读全文
posted @ 2016-11-19 21:58 john8169 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 读写锁,分为读锁和写锁,多个读锁不互斥,读锁和写锁互斥,写锁与写锁互斥,这是JVM自己控制的,你只要上好相应的锁即可,如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁.总之,读的时候上... 阅读全文
posted @ 2016-11-19 10:51 john8169 阅读(143) 评论(0) 推荐(0) 编辑
摘要: Lock比传统线程模型中的Synchronied方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码段要实现同步互斥的效果,它们必须用同一个Lock对象,锁是在代表要操作的资源的类的内部方法中,而不是线程代码中.Lock就用来替代synchr... 阅读全文
posted @ 2016-11-19 10:03 john8169 阅读(106) 评论(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 阅读(116) 评论(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 阅读(112) 评论(0) 推荐(0) 编辑
摘要: AtomicInteger 用得不当被笑掉大牙AtomicIntegerArrayAtomicIntegerFieldUpdater:对类中整数字段进行操作,需要先反射获取对象身上的字段即atomic包,可以对基本数据、对数组中的基本数据、对类中的基本数据等进行操作,... 阅读全文
posted @ 2016-11-18 23:02 john8169 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 示例: package javaplay.thread.test;import java.util.Random;public class ThreadLocalTest { // 相当于一个hashmap,数据是线程范围内的,一个线程一个数据,特别简单 static... 阅读全文
posted @ 2016-11-18 22:39 john8169 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 要实现线程范围内的数据共享,就是说不管是A模块还是B模块,如果它们现在在同一个线程上运行,它们操作的数据应该是同一个,下面的做法就不行: package javaplay.thread.test;import java.util.Random;public class... 阅读全文
posted @ 2016-11-18 20:22 john8169 阅读(287) 评论(0) 推荐(0) 编辑
摘要: wait和notify实例子线程循环10次,主线程循环100次。接着子线程循环10次,主线程循环100次。如此循环50次。摘自张孝祥老师线程视频源码。 package javaplay.thread.test;public class TraditionalThrea... 阅读全文
posted @ 2016-11-18 19:26 john8169 阅读(125) 评论(0) 推荐(0) 编辑
摘要: package javaplay.thread.test;public class TraditionalThreadSynchronized { public static void main(String[] args) { new TraditionalThr... 阅读全文
posted @ 2016-11-17 23:04 john8169 阅读(94) 评论(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 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 1.如果每个线程执行的代码相同,可以使用同一个Runable对象,这个Runable对象中有那个共享数据,例如卖票系统就可以这样做。 package javaplay.test;public class MulteThreadShareData { public st... 阅读全文
posted @ 2016-11-16 23:29 john8169 阅读(1338) 评论(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 阅读(89) 评论(0) 推荐(0) 编辑
摘要: #xxx=java.util.ArrayListxxx=javaplay.day3.aopframework.ProxyFactoryBeanxxx.advice=javaplay.day3.MyAdvicexxx.target=java.util.ArrayList... 阅读全文
posted @ 2016-11-16 21:03 john8169 阅读(102) 评论(0) 推荐(0) 编辑
摘要: 这篇博文如果不能在五分钟内写出来,说明没有掌握aop的原理终于知道为什么不能invoke方法里调用proxy.toString()方法,因为要转发 package javaplay.day3;import java.lang.reflect.InvocationHan... 阅读全文
posted @ 2016-11-07 22:10 john8169 阅读(179) 评论(1) 推荐(0) 编辑
摘要: 代理的原理与作用及AOP的概念代理1.要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理、日志、计算方法的运行时间、事务管理、等等,你准备如何做? 2.编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法... 阅读全文
posted @ 2016-11-01 22:09 john8169 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 1. 什么是类加载器? 加载类的工具.2. Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类: BootStrap,ExtClassLoader,AppClassLoader3. 类加载器也是Java类,因为其是java类的... 阅读全文
posted @ 2016-10-25 22:05 john8169 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 1.使用泛型,集合中元素限定为一个特定类型,集合中只能存储同一个类型对象,这样更安全,获取元素时,不需要对对象进行强制类型转换,更方便。2.泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序的非法输入,编译器编译带类型说明的集合时会去掉类... 阅读全文
posted @ 2016-10-23 17:21 john8169 阅读(113) 评论(0) 推荐(0) 编辑
摘要: 编码习惯:类名/属性名是名词或者形容词加名词,方法名是动词或者是动词加名词了解注解,覆盖equals方法时类型参数不能是除Object之外的类型,否则equals不起作用,因为被调用的还是Object的equals方法,加上注解@Override即可解决;注解相当于一... 阅读全文
posted @ 2016-10-23 14:52 john8169 阅读(120) 评论(0) 推荐(0) 编辑