synchronized锁
线程方法
- sleep ,意思就是睡眠 ,当前线程暂停一段时间让给别的线程去运行,sleep是由睡眠时间而定,等规定的时间到了自动复活
- Yield 就是当前线程正在执行的时候停止下来进入等待队列 ,回到等待队列里在系统的调度算法里呢 还是依然可能把你刚回去的这个线程拿回来继续执行,意思就是我让出来一下CPU,后面调度能不能抢到就不管了。
- 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的效率非常低。
-
改进 ,后俩有了锁升级这个概念 马哥 的文章《我就是厕所所长》
-
https://www.jianshu.com/p/16c8b3707436
马哥微信公众号小说https://mp.weixin.qq.com/s/Fep24OWHeck5O-sgILi39Q
-
执行时间短,线程数少,用自旋
-
执行时间长,线程数多 用系统锁