java并发编程基础2

1.synchronized关键字的作用

  当多个线程并发访问或者说操作同一个对象,会出现线程安全问题,这个问题可以用synchronzed解决

2.synchronized的用法

  可以加在静态方法,也可以加在成员方法上,也可以用代码块使用,作用有不同,具体看锁住是哪一个对象

3.synchronzied原理

  synchronzied在1。6之前做了优化,在之前只有重量级锁的实现,这种是基础悲观锁的实现,性能较差,但是再1.6之后加入了偏向锁和轻量级锁的实现,因为考虑到程序代码大部分情况下只有一个线程去访问,不需要重量级锁的相对较高的性能操作,而这两种是基于jvm底层的cas操作来实现,未获得锁的线程不会阻塞,而是会重试,达到一定次数会升级到重量级锁

  不同锁的标志是存储在锁对象对象头中,00代表轻量级锁,10代表重量级,01偏向锁

4.偏向锁

  偏向锁的情况下,没有锁竞争,锁对象的对象头会存储线程的id,还有偏向锁标志01,

5,轻量级锁

  轻量级锁在线程没有获得锁的情况下,会自旋再次获取锁,具体操作是cas命令将对象头里面的数据复制到自己的线程空间,并指向锁对象,成功即为获取锁成功,没有成功会再次获得锁,但自旋会消耗cpu资源,所以在指定次数自旋之后会锁膨胀成重量级锁

6.重量级锁

  重量级锁是基础monitor对象监视器实现了,每个对象有存在这样的一个对象,当线程执行monitor enter指令的话,会获得锁,其他线程就无法获得锁,并会被加到一个同步队列中,当执行完代码块后,会monitor exit指令来释放锁,这样操作系统会在队列中随机选择一个线程来继续竞争锁

7.wait 和notify

  锁对象的wait方法会是进入同步块也就是获得锁的线程加入到等待队列中,并释放锁,notify方法会将等待队列中的线程唤醒一个并加入到同步队列竞争锁

 

posted @ 2020-08-01 19:24  红色蓝色  阅读(58)  评论(0)    收藏  举报