1.如何自定义一个注解
@Documented
@Tartget(ElementType.Type)
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnno{
}
2.生产者-消费者模式
3.synchronized的缺陷
如果获取锁的线程被阻塞了,但是又没有释放锁,其他线程只能一直等待
如果多个线程只是进行读操作,当一个线程在进行读操作时,其他线程只能等待
Synchrn不e道线程有没有成功获取锁,而通过Lock可以
1)Lock不是Java语言内置的,synchronized是java语言的关键字,因此是内置的。Lock是一个接口
2)synchronized不需要手动释放锁,当synchronized方法或代码块执行完毕之后,系统会自动让线程释放锁。
而Lock需要手动释放,如果没有释放,就有可能导致出现死锁现象。
3)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁
Lock一定要使用try catch语句中,并在finally中lock.unlock()
ReentrantLock是唯一实现了Lock接口的类,tryLock()尝试获取锁,lockInterruptibly()可以被interrupt()方法中断,直接抛出InterruptedException
ReadWriteLock也是一个接口 readLock(),writeLock()可以获得读锁和写锁
ReentrantReadWriteLock