黑马程序员技术交流社区

标题: 线程锁的问题 [打印本页]

作者: 杨明宁    时间: 2012-10-29 10:24
标题: 线程锁的问题
本帖最后由 杨明宁 于 2012-10-30 09:43 编辑
  1. package me.luger.thread;

  2. public class SynchronizedTest {

  3.     public static void main(String[] args) {
  4.         Synchronized1 s1 = new Synchronized1("s1");
  5.         Synchronized1 s2 = new Synchronized1("s2");
  6.         s1.start();
  7.         s2.start();
  8.     }
  9. }

  10. class Synchronized1 extends Thread{
  11.    
  12.     Synchronized1(String name){
  13.         super(name);
  14.     }

  15.     public void run() {
  16.         m1();
  17.     }
  18.    
  19.     synchronized void m1(){
  20.         for(int i = 0;i<1000;i++){
  21.             System.out.println(getName()+"------m1--------");
  22.         }
  23.     }
  24.    
  25. }
复制代码
这个是我写的线程锁 我想测试的是“被锁定指的是 其他线程不能访问这个方法”

但是这个好像看不出结果来 是不是我例子写的不对 哪位大神给一个能测试上面这句话的例子
对了还有一个问题 被锁定是指其他线程不能访问这个方法 还是不能访问这个类的所有带锁的方法

作者: 林志进    时间: 2012-10-29 11:29
Synchronized1 s1 = new Synchronized1("s1");
Synchronized1 s2 = new Synchronized1("s2");
通过extends Thread方法new出了两条不操作相同对象的线程,他们的synchronized分别代表两条线程自己,所以线程不会互锁。
如果要实现线程同步功能,共享相同的变量,需要一个类来实现runnable接口,创建的两条线程构造函数都传参同一个对象。
作者: 李连闯    时间: 2012-10-29 11:46
对于synchronized void m1(){...}
同步的锁是this,实际的意思就是同一个线程在调用同一个类中的不同的方法时是互斥的,
对于s1.start();和s2.start();
对象不同,锁不同,所以就起不到互斥的作用,
如果想要互斥需要使用的锁可以是Synchronized1.class
void m1(){
         synchronized(Synchronized1.class){
            for(int i = 0;i<1000;i++){
                System.out.println(getName()+"------m1--------");
            }
         }
    }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2