java多线程总结


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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值