Java动态代理
JDK动态代理使用的非常广泛,Spring AOP中、MyBatis的mapper中都用到了JDK动态代理。
JDK动态代理的使用1、创建代理类接口及代理类。2、创建一个实现了InvocationHandler接口的类,实现该接口中的invoke方法。3、通过Proxy的newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h)方法创建一个代理对象。来个例子:创建一个Hello的接口
1234public interface Hello { void sayHello();}
创建一个实现了Hello接口的实现类。
123456public class HelloImpl implements Hello { public void sayHello() { System.out.println("hello"); }}
创建一个实现了InvocationHandler接口的类。
1 ...
Java内省
内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。说简单一点就是操作JavaBean的一套API。
什么是JavaBean?javaBean只是一种规范,大家都按照约定好的一套规则写java类,既然是规范就有一定的要求:
类是public的,然后有个无参的构造函数
属性是private的,通过设置setXXX()和getXXX()来访问
能支持事件,例如 addXXXXListener(XXXEvent e), 事件可以是 Click 事件,Keyboard 事件等等
提供应该 反射机制,这样可以查看java bean的各种信息
可以序列化,可以保存在硬盘上例如:12345678910111213141516171819202122public class User { private String name; private String address; public String getName() { return name; } publi ...
ReentrantLock源码分析
ReentrantLock是一个可重入且独占式的锁,该锁支持获取锁时的公平和非公平选择。
公平锁公平锁遵循FIFO的原则,所有的线程都会顺序执行
获取锁123456789101112 //加锁 final void lock() { acquire(1); }//调用AbstractQueuedSynchronizer public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); }
是否是获得锁,还是进入队列等待的逻辑在tryAcquire 函数里。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647protected final boolean tryAcquire(in ...
AbstractQueuedSynchronizer源码分析-独占式
独占式获得锁独占式下的顶层函数为acquire(),首先调用tryAcquire()函数获得锁,如果获取不到锁,则将线程加入到队列中。
1234567public final void acquire(int arg) { if (!tryAcquire(arg) && //尝试获得锁 //将线程加入到对列中,循环获取资源,并在一定次数后阻塞 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) //在阻塞过程中线程可能被中断,忽略中断,在获取到锁后再进行中断。 selfInterrupt();}
addWaiter()将线程加入到阻塞队列中。
12345678910111213141516private Node addWaiter(Node mode) { //将建一个队列节点,并设置该节点为独占模式 Node node = new Node(Thread.currentThread(), mode); // 尝试快速插入 ...
AbstractQueuedSynchronizer源码分析-共享式
共享式获得锁共享式获取锁的顶层函数为acquireShared(),该函数首先调用tryAcquireShared()尝试互锁,如果获取不到锁,则将该线程加入到队列中。
1234567public final void acquireShared(int arg) { //尝试获取锁 //小于0,代表获取锁失败 // 具体的逻辑由子类实现 if (tryAcquireShared(arg) < 0) doAcquireShared(arg); }
doAcquireShared()函数将该线程加入到队列中,然后通过有限次的循环获取锁,并判断是否该阻塞
12345678910111213141516171819202122232425262728293031323334353637383940private void doAcquireShared(int arg) { //将该线程加入到队列中 final Node node = addWait ...