java线程学习总结1(java thread培训总结1)
1
1
Daemon线程 2
2
2
2
(实例方法的锁) 3
3
4
4
4
4
volatile 4
5
5
5
6
3. Java线程调度 6
Java优先级 6
. 绿色线程 6
本地线程 7
Windows本地线程 7
7
8
8
5工作队列 9
9
初始化状态
就绪状态
运行状态
阻塞状态
终止状态
Daemon线程
Daemon线程区别一般线程之处是:主程序一旦结束,Daemon线程就会结束。
为了协调多个并发运行的线程使用共享资源才引入了锁的概念。
任何多线程应用程序都有死锁风险。当一组线程中的每一个都在等待一个只
有该组中另一个线程才能引起的事件时,我们就说这组线程死锁了。换一个说法
就是一组线程中的每一个成员都在等待别的成员占有的资源时候,就可以说这组
线程进入了死锁。死锁的最简单情形是:线程 A 持有对象 X 的独占锁,并且
在等待对象 Y 的锁,而线程 B 持有对象 Y 的独占锁,却在等待对象 X 的锁。
除非有某种方法来打破对锁的等待(Java 锁定不支持这种方法),否则死锁的线
程将永远等下去。
wait方法
wait方法是java根对象Object含有的方法,表示等待获取某个锁。在wait方法进入前,会释放相应的锁,在wait方法返回时,会再次获得某个锁。
如果wait()方法不带有参数,那只有当持有该对象锁的其他线程调用了notify或者notifyAll方法,才有可能再次获得该对象的锁。
如果wait()方法带有参数,比如:wait(10),那当持有该对象锁的其他线程调用了notify或者notifyAll方法,或者指定时间已经过去了,才有可能再次获得该对象的锁。
参考
notify/notifyAll方法
这里我就不再说明了。哈哈,偷点懒。
yield方法
yield()会自动放弃CPU,有时比sleep更能提升性能。
(实例方法的锁)
在同步代码块中使用锁的时候,担当锁的对象可以是这个代码所在对象本身或者一个单独的对象担任,但是一定要确保锁对象不能为空。如果对一个null对象加锁,会产生异常的。原则上不要选择一个可能在锁的作用域中会改变值的实例变量作为锁对象。
锁对象,一种是对象自己担任,一种是定义一个普通的对象作为private property来担任,另外一种是建立一个新的类,然后用该类的实例来担任。
参考:
,使用对象自己做锁对象
使用一个实例对象作锁对象
实例方法存在同步的问题,同样,类方法也存在需要同步的情形。一般类方法的类锁是一个static object来担任的。当然也可以采用类本身的类对象来作为类锁。
一个类的实例方法可以获得该类实例锁,还可以尝试去访问类方法,包含类同步方法,去获得类锁。
一个类的类方法,可以尝试获得类锁,但是不可以尝试直接获得实例锁。需要先生成一个实例,然后在申请获得这个实例的实例锁。
参考
使用类的属性对象作为类锁。
如果一个对象的所有的public方法都是同步方法,也就是说是public方法是线程安全的,那该对象的private方法,在不考虑继承的情况下,可以设置为不是线程安全的方法。
参考
java线程学习总结 来自淘豆网m.daumloan.com转载请标明出处.