黑马程序员技术交流社区
标题:
高手们,多线程中同步的各种锁,都是怎么获取的啊?
[打印本页]
作者:
王中利
时间:
2012-10-10 20:06
标题:
高手们,多线程中同步的各种锁,都是怎么获取的啊?
高手们,多线程中同步的各种锁,都是怎么获取的啊?
作者:
曾浩
时间:
2012-10-10 21:56
同步函数使用的锁是this
静态同步函数的锁是 类名.class
在同步代码块 synchronized() 中需要接收的参数 是一个对象 只要各线程中使用的是同一个对象作为参数传递就ok
作者:
戴进飘
时间:
2012-10-11 11:38
每个对象都有一个内置锁。当程序运行到非静态 synchronized 方法上时,将自动获得与正在执行代码类的当前实例(即 this 实例)有关的锁。java.lang.Thread.sleep() 方法执行时并不释放此锁;java.lang.Object.wait() 方法执行时释放此锁。
作者:
草上飞
时间:
2012-10-23 20:12
根据同步的原理:如果能获取一个共享对象锁或类锁,及可实现同步。那么我们是不是可以通过共享一个类锁来实现呢?
是的,我们可以使用静态同步方法,根据静态方法的特性,它只允许类对象本身才可以调用,不能通过实例化一个类对象来调用。那么如果获得了这个静态方法的锁,
也就是获得这个类锁,而这个类锁都是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对象锁。
②同步方法:获取的是方法所属的类对象,及类对象锁。
静态同步方法,由于多个线程都会共享,所以一定会同步。
而非静态同步方法,只有在单例模式下才会同步。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2