根据同步的原理:如果能获取一个共享对象锁或类锁,及可实现同步。那么我们是不是可以通过共享一个类锁来实现呢?
是的,我们可以使用静态同步方法,根据静态方法的特性,它只允许类对象本身才可以调用,不能通过实例化一个类对象来调用。那么如果获得了这个静态方法的锁,
也就是获得这个类锁,而这个类锁都是TestThread类锁,及达到了获取共享类锁的目的。
实现代码如下:
1.package thread_test;
2.
3./**
4. * 测试扩展Thread类实现的多线程程序
5. *
6. * @author ciding
7. * @createTime Dec 7, 2011 9:37:25 AM
8. *
9. */
10.public class TestThread extends Thread{
11. private int threadnum;
12.
13. public TestThread(int threadnum) {
14. this.threadnum = threadnum;
15. }
16.
17. public static synchronized void staticTest(int threadnum) {
18. for(int i = 0;i<1000;i++){
19. System.out.println("NO." + threadnum + ":" + i );
20. }
21. }
22.
23. public static void main(String[] args) throws Exception {
24. for(int i=0; i<10; i++){
25. new TestThread(i).start();
26. Thread.sleep(1);
27. }
28. }
29.
30. @Override
31. public void run(){
32. staticTest(threadnum);
33. }
34.}
运行结果略,与例二中一样。
以上的内容主要是说明两个问题:同步块与同步方法。
①同步块:获取的对象锁是synchronized(flag)中的flag对象锁。
②同步方法:获取的是方法所属的类对象,及类对象锁。
静态同步方法,由于多个线程都会共享,所以一定会同步。
而非静态同步方法,只有在单例模式下才会同步。
|