线程:cpu同时执行多个任务
synchonized 代码块,对象,类
同步方法和非同步方法可以同时执行
同步方法可以调用同步方法(重入)
脏读:之同步写,不同步读
死锁的demo 一个线程先对A加锁,然后在线程内对B加锁 另一个线程先对B加锁,后对A加锁
同步方法可以调用同步方法(重入)
脏读:之同步写,不同步读
死锁的demo 一个线程先对A加锁,然后在线程内对B加锁 另一个线程先对B加锁,后对A加锁
子类的同步方法可以调用父类的同步方法
同步方法抛出异常,锁会被释放,如果不想释放锁,try-catch异常
volatile 变量在线程之间可见(无锁同步) 效率比synchronized高的多 synchronized是重量级锁
volatile并不能保证多个线程同时修改同一个变量的一致性问题,也就说volatile并不能替代synchronized(既有可见性,又有原子性)
volatile并不能保证多个线程同时修改同一个变量的一致性问题,也就说volatile并不能替代synchronized(既有可见性,又有原子性)
使用AtomXXX类的方法都是原子性的,但不保证多个方法连续调用是原子性的
锁定某对象o,如果o的属性发生改变,不影响锁的使用
但如果o变成另外一个对象,则锁定的对象发生改变
应该避免将锁定的对象的引用变成另外的对象
但如果o变成另外一个对象,则锁定的对象发生改变
应该避免将锁定的对象的引用变成另外的对象
不要把字符串常量作为锁对象
object的wait()方法会释放锁,而notify()不会释放锁
CountDownLatch门闩 CountDownLatch c = new CountDownLatch(1); await() countDown()
ReentranLock 互斥锁
ReetnranLock用于替代synchronized 更加灵活方便
ReentranLock必须手动开启锁和释放锁,一般结合try-catch-finally使用
ReetnranLock用于替代synchronized 更加灵活方便
ReentranLock必须手动开启锁和释放锁,一般结合try-catch-finally使用
ReentranLock可以进行“尝试获取锁”tryLock 线程可以在无法获取锁在指定时间内没有获得锁决定是否继续等待
reentranLodk可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应,在一个线程等待锁的过程中可以被打断
reentranLodk可以调用lockInterruptibly方法,可以对线程interrupt方法做出响应,在一个线程等待锁的过程中可以被打断
ReentranLock可以指定为公平锁 在构造函数中指定true