java多线程总结

来源:互联网 发布:网络课考古发现与探索 编辑:程序博客网 时间:2024/06/05 23:45

一、
  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字节,那么他们有可能会存在于一条缓存行上






0 0