常见的线程状态有六种:
当我们new一个线程时,还没调用start()该线程 处于 新建状态
线程调用start()方法时 它会被线程调度器执行,也就是交给操作系统执行,这整个状态就叫Runnable 内部有(1)Ready就绪状态/(2)Running运行状态
如果线程顺利执行完了就会进入(3)Teminated结束状态,
在Runnable 这个人状态里还有一些状态的变迁 (4)TimedWaiting等待、(5)Waiting等待、(6)Blocked阻塞。
synchronized锁的是对象 并不是锁的代码 这一点一定要搞清楚??
synchronized(Object)
在一个方法上不加任何参数的话 锁的是this
锁定方法和非锁定方法 同时进行
为什么要加???
比如:我们对一个数字递增,两个线程一块对它递增,如果两个线程同时访问的时候,第一个线程一读它是0,然后把它+1,在自己的线程内部内存里面算 还没写回去的时候此时第二个线程读到了它还是0,再加1写回去,本来是加两次但结果还是1.那我们就可以给这个递增的过程上把??,就是说第一个线程对这个线程访问的时候它是独占的,不允许别的线程访问,必须等我对他+1完成返回之后才能读。
synchronized 可重入性 (是必须了解的一个概念)
模拟一个父类子类的概念,父类P 里面有个方法m是synchronized 子类C 里面用super.m调用 如果是不可重入那父子间的这个继承就死锁了
早期,jdk早期的时候 这个synchronized的底层是重量级的,重到这个synchronized要去操作系统去申请锁的底部,这就会造成synchronized的效率非常低。
改进 ,后俩有了锁升级这个概念 马哥 的文章《我就是厕所所长》
https://www.jianshu.com/p/16c8b3707436
马哥微信公众号小说https://mp.weixin.qq.com/s/Fep24OWHeck5O-sgILi39Q
执行时间短,线程数少,用自旋
执行时间长,线程数多 用系统锁
原文:https://www.cnblogs.com/beizhai/p/13796263.html