一、
1、执行完同步代码块,就会释放锁
2、在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放
3、在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放锁,进
入对象的等待池
除了以上情况以外,只要持有锁的线程还没有执行完同步代码块,就不会释放锁。
在下面情况下,线程是不会释放锁的:
1、执行同步代码块的过程中,执行了Thread.sleep()方法,当前线程放弃CPU,开始睡眠,在睡眠中不会释放锁。
2、在执行同步代码块的过程中,执行了Thread.yield()方法,当前线程放弃CPU,但不会释放锁。
3、在执行同步代码块的过程中,其他线程执行了当前线程对象的suspend()方法,当前线程被暂停,但不会释放锁。
二、避免在构造函数中启动一个线程,因为会带来子类化问题并且会引起this逸出
三、volatile变量正确使用:
1、一个线程修改变量后,其他线程都能看到
2、防止重排序发生
3、适合一个线程写操作,其他多线程读操作的场景
四、ReentrantReadWriteLock使用场景:在读多写少的场景下
五、解决伪共享:解决伪共享的方法是通过补齐(Padding),使得每一条缓存行只存一个多线程变量,
因为一般缓存行的大小是64字节。这意味着,小于64字节的变量,是有可能存在于同一条缓存行的。
例如变量X大小32字节,变量Y大小32字节,那么他们有可能会存在于一条缓存行上