A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

高手们,多线程中同步的各种锁,都是怎么获取的啊?

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

3 个回复

倒序浏览
同步函数使用的锁是this
静态同步函数的锁是  类名.class

在同步代码块 synchronized() 中需要接收的参数 是一个对象  只要各线程中使用的是同一个对象作为参数传递就ok  

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
每个对象都有一个内置锁。当程序运行到非静态 synchronized 方法上时,将自动获得与正在执行代码类的当前实例(即 this 实例)有关的锁。java.lang.Thread.sleep() 方法执行时并不释放此锁;java.lang.Object.wait() 方法执行时释放此锁。
回复 使用道具 举报

根据同步的原理:如果能获取一个共享对象锁或类锁,及可实现同步。那么我们是不是可以通过共享一个类锁来实现呢?

  是的,我们可以使用静态同步方法,根据静态方法的特性,它只允许类对象本身才可以调用,不能通过实例化一个类对象来调用。那么如果获得了这个静态方法的锁,
也就是获得这个类锁,而这个类锁都是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对象锁。

  ②同步方法:获取的是方法所属的类对象,及类对象锁。

  静态同步方法,由于多个线程都会共享,所以一定会同步。

  而非静态同步方法,只有在单例模式下才会同步。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马