文档详情

java线程学习总结.doc

发布:2017-12-14约6.18千字共11页下载文档
文本预览下载声明
java线程学习总结1(java thread培训总结1) 1.线程中一些基本术语和概念 1 1.1线程的几个状态 1 1.2 Daemon线程 2 1.3锁的定义 2 1.4死锁 2 1.5.Java对象关于锁的几个方法 2 1.6锁对象(实例方法的锁) 3 1.7类锁 3 1.8.线程安全方法与线程不安全方法 4 1.9类锁和实例锁混合使用 4 1.10锁的粒度问题 4 1.11.读写锁 4 1.12 volatile 4 2.线程之间的通讯 5 2.1屏障 5 2.2.锁工具类 5 2.3.条件变量 6 3. Java线程调度 6 3.1 Java优先级 6 3.2. 绿色线程 6 3.3 本地线程 7 3.4 Windows本地线程 7 3.5线程优先级倒置与继承 7 3.6循环调度 8 4.线程池 8 5工作队列 9 6.参考资料 9 1.线程中一些基本术语和概念 1.1线程的几个状态 初始化状态 就绪状态 运行状态 阻塞状态 终止状态 1.2 Daemon线程Daemon线程区别一般线程之处是:主程序一旦结束,Daemon线程就会结束。死锁任何多线程应用程序都有死锁风险。当一组线程中的每一个都在等待一个只有该组中另一个线程才能引起的事件时,我们就说这组线程死锁了。一组线程死锁的最简单情形是:线程 A 持有对象 X 的独占锁,并且在等待对象 Y 的锁,而线程 B 持有对象 Y 的独占锁,却在等待对象 X 的锁。除非有某种方法来打破对锁的等待(Java 锁定不支持这种方法),否则死锁的线程将永远等下去。Java对象关于锁的几个方法 1.5.1 wait方法 wait方法是java根对象Object含有的方法,表示等待获取某个锁。在wait方法进入前,会释放相应的锁,在wait方法返回时,会再次获得某个锁。 如果wait()方法不带有参数,那只有当持有该对象锁的其他线程调用了notify或者notifyAll方法,才有可能再次获得该对象的锁。 如果wait()方法带有参数,比如:wait(10),那当持有该对象锁的其他线程调用了notify或者notifyAll方法,或者指定时间已经过去了,才有可能再次获得该对象的锁。 参考 thread.lock.SleepAndWait 1.5.2 notify/notifyAll方法 这里我就不再说明了。哈哈,偷点懒。 1.5.3 yield方法 yield()会自动放弃CPU,有时比sleep更能提升性能thread.lock.UseSelfAsLock,使用对象自己做锁对象 thread.lock.UseObjAsLock 使用一个实例对象作锁对象 thread.lock.UseAFinalObjAsLock使用常量对象作为一个锁对象 1.7类锁 实例方法存在同步的问题,同样,类方法也存在需要同步的情形。一般类方法的类锁是一个static object来担任的。当然也可以采用类本身的类对象来作为类锁。 一个类的实例方法可以获得该类实例锁,还可以尝试去访问类方法,包含类同步方法,去获得类锁。 一个类的类方法,可以尝试获得类锁,但是不可以尝试直接获得实例锁。需要先生成一个实例,然后在申请获得这个实例的实例锁。 参考 thread.lock.UseStaticObjAsStaticLock 使用类的属性对象作为类锁。 thread.lock.UseClassAsStaticLock使用类的类对象作为类锁 1.8.线程安全方法与线程不安全方法 如果一个对象的所有的public方法都是同步方法,也就是说是public方法是线程安全的,那该对象的private方法,在不考虑继承的情况下,可以设置为不是线程安全的方法。 参考 thread.lock.SynMethrodAndNotSynMethrod 1.9类锁和实例锁混合使用 在实例方法中混合使用类锁和实例锁;可以根据前面说的那样使用实例锁和类锁。 在类方法中混合使用类锁和实例锁,可以根据前面说的那样使用类锁,为了使用实例锁,先得生成一个实例,然后实例锁。 参考 thread.lock.StaticLockAndObjLock 1.10锁的粒度问题。 为了解决对象锁的粒度过粗,会导死锁出现的可能性加大,锁的粒度过细,会程序开发维护的工作加大。对于锁的粒度大小,这完全要根据实际开发需要来考虑,很难有一个统一的标准。 1.11.读写锁一个读写锁支持多个线程同时访问一个对象,但是在同一时刻只有一个线程可以修改此对象,并且在访问进行时不能修改。thread.lock.ReadWriteLock 1.12 volatile 在Java中设置变量值的操作,除了long和double类型的变
显示全部
相似文档