synchronized锁

线程方法

  1. sleep ,意思就是睡眠 ,当前线程暂停一段时间让给别的线程去运行,sleep是由睡眠时间而定,等规定的时间到了自动复活
  2. Yield 就是当前线程正在执行的时候停止下来进入等待队列 ,回到等待队列里在系统的调度算法里呢 还是依然可能把你刚回去的这个线程拿回来继续执行,意思就是我让出来一下CPU,后面调度能不能抢到就不管了。
  3. join 意思就是在自己当前线程加入你调用的线程(),本线程等待。等调用的线程执行完 自己再去执行。例如:ti和t2两个线程,在t1的某个点上调用了t2.join,它会跑到t2上去运行 ,t1等t2运行完后,t1和t2并成为一条线再去运行(自己 jion 自己 没意义)

线程状态

常见的线程状态有六种:

当我们new一个线程时,还没调用start()该线程 处于 新建状态

线程调用start()方法时 它会被线程调度器执行,也就是交给操作系统执行,这整个状态就叫Runnable 内部有(1)Ready就绪状态/(2)Running运行状态

如果线程顺利执行完了就会进入(3)Teminated结束状态,

在Runnable 这个人状态里还有一些状态的变迁 (4)TimedWaiting等待、(5)Waiting等待、(6)Blocked阻塞。

synchronized锁
  • synchronized锁的是对象 并不是锁的代码 这一点一定要搞清楚🔺

  • synchronized(Object)

    • -不能用String常量 Integer Long这些数据类型
  • 在一个方法上不加任何参数的话 锁的是this

  • 锁定方法和非锁定方法 同时进行

为什么要加🔒?

比如:我们对一个数字递增,两个线程一块对它递增,如果两个线程同时访问的时候,第一个线程一读它是0,然后把它+1,在自己的线程内部内存里面算 还没写回去的时候此时第二个线程读到了它还是0,再加1写回去,本来是加两次但结果还是1.那我们就可以给这个递增的过程上把🔒,就是说第一个线程对这个线程访问的时候它是独占的,不允许别的线程访问,必须等我对他+1完成返回之后才能读。

synchronized 可重入性 (是必须了解的一个概念)

模拟一个父类子类的概念,父类P 里面有个方法m是synchronized 子类C 里面用super.m调用 如果是不可重入那父子间的这个继承就死锁了

synchronized的底层实现:
  • 早期,jdk早期的时候 这个synchronized的底层是重量级的,重到这个synchronized要去操作系统去申请锁的底部,这就会造成synchronized的效率非常低。

  • 改进 ,后俩有了锁升级这个概念 马哥 的文章《我就是厕所所长》

    1. https://www.jianshu.com/p/b43b7bf5e052

    2. https://www.jianshu.com/p/16c8b3707436

      马哥微信公众号小说https://mp.weixin.qq.com/s/Fep24OWHeck5O-sgILi39Q

  • 执行时间短,线程数少,用自旋

  • 执行时间长,线程数多 用系统锁

posted @ 2020-10-11 09:34  北斋  阅读(101)  评论(0编辑  收藏  举报