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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨明宁 中级黑马   /  2012-10-29 10:24  /  2243 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨明宁 于 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. }
复制代码
这个是我写的线程锁 我想测试的是“被锁定指的是 其他线程不能访问这个方法”

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

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

2 个回复

倒序浏览
Synchronized1 s1 = new Synchronized1("s1");
Synchronized1 s2 = new Synchronized1("s2");
通过extends Thread方法new出了两条不操作相同对象的线程,他们的synchronized分别代表两条线程自己,所以线程不会互锁。
如果要实现线程同步功能,共享相同的变量,需要一个类来实现runnable接口,创建的两条线程构造函数都传参同一个对象。
回复 使用道具 举报
对于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--------");
            }
         }
    }

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马