Java线程:线程的同步 - 编程入门网
获得一个锁,就没有任何 其他线程可以进入(该对象的)类中的任何一个同步方法。
5)、如果线程拥有同步和非同步方法,则非同步方法可以被多个线程自由访 问而不受锁的限制。 6)、线程睡眠时,它所持的任何锁都不会释放。 7)、线程可以获得多个锁。比如,在一个对象的同步方法里面调用另外一个 对象的同步方法,则获取了两个对象的同步锁。 8)、同步损害并发性,应该尽可能缩小同步范围。同步不但可以同步整个方 法,还可以同步方法中一部分代码块。 9)、在使用同步代码块时候,应该指定在哪个对象上同步,也就是说要获取 哪个对象的锁。例如:
当然,同步方法也可以改写为非同步方法,但功能完全一样的,例如:
与
效果是完全一样的。 Java线程:线程的同步(3)时间:2010-12-08 BlogJava Werther三、静态方法同步 要同步静态方法,需要一个用于整个类对象的锁,这个对象是就是这个类 (XXX.class)。 例如:
等价于
四、如果线程不能不能获得锁会怎么样 如果线程试图进入同步方法,而其锁已经被占用,则线程在该对象上被阻塞 。实质上,线程进入该对象的的一种池中,必须在哪里等待,直到其锁被释放, 该线程再次变为可运行或运行为止。 当考虑阻塞时,一定要注意哪个对象正被用于锁定: 1、调用同一个对象中非静态同步方法的线程将彼此阻塞。如果是不同对象, 则每个线程有自己的对象的锁,线程间彼此互不干预。 2、调用同一个类中的静态同步方法的线程将彼此阻塞,它们都是锁定在相同 的Class对象上。 3、静态同步方法和非静态同步方法将永远不会彼此阻塞,因为静态方法锁定 在Class对象上,非静态方法锁定在该类的对象上。 4、对于同步代码块,要看清楚什么对象已经用于锁定(synchronized后面括 号的内容)。在同一个对象上进行同步的线程将彼此阻塞,在不同对象上锁定的 线程将永远不会彼此阻塞。 五、何时需要同步 在多个线程同时访问互斥(可交换)数据时,应该同步以保护数据,确保两 个线程不会同时修改更改它。 对于非静态字段中可更改的数据,通常使用非静态方法访问。 对于静态字段中可更改的数据,通常使用静态方法访问。 如果需要在非静态方法中使用静态字段,或者在静态字段中调用非静态方法 ,问题将变得非常复杂。已经超出SJCP考试范围了。 Java线程:线程的同步(4)时间:2010-12-08 BlogJava Werther六、线程安全类 当一个类已经很好的同步以保护它的数据时,这个类就称为“线程安全的” 。 即使是线程安全类,也应该特别小心,因为操作的线程是间仍然不一定安全 。 举个形象的例子,比如一个集合是线程安全的,有两个线程在操作同一个集 合对象,当第一个线程查询集合非空后,删除集合中所有元素的时候。第二个线 程也来执行与第一个线程相同的操作,也许在第一个线程查询后,第二个线程也 查询出集合非空,但是当第一个执行清除后,第二个再执行删除显然是不对的, 因为此时集合已经为空了。 看个代码:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |