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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM汪磊 高级黑马   /  2013-3-23 00:07  /  1214 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM汪磊 于 2013-3-23 10:43 编辑

class Res
{
        String sex;
        String name;
}

class InPut implements Runnable
{
        private Res r;
        InPut(Res t)
        {
                this.r=t;
        }
        public void run()
        {
                int x=0;
                while(true)
                {
                        synchronized(InPut.class)//同步代码块锁为对象,静态同步函数锁为类名.class.为什么这里同步代码块用类名.class也可以呢????
                        {
                                if(x==0)
                                {
                                        r.name="mike";
                                        r.sex="man";
                                
                                }
                                else
                                {
                                        r.name="丽丽";
                                        r.sex="女女女女女女";
                                       
                                }
                                x=(x+1)%2;
                        }
                }
        }
}

class OutPut implements Runnable
{
        private Res r;
        OutPut(Res t)
        {
                this.r=t;
        }
        public void run()
        {
                while(true)
                {
                        synchronized(InPut.class)
                        {
                                System.out.println(r.name+"....."+r.sex);
                        }
                }
        }
}

class  Test99
{
        public static void main(String[] args)
        {
                Res r=new Res();
                InPut n=new InPut(r);
                OutPut m=new OutPut(r);
                Thread t1=new Thread(n);
                Thread t2=new Thread(m);
                t1.start();
                t2.start();
        }
}


评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

正序浏览
同步函数的锁要用对象,而类名.class也是一个对象。而你可以先创建一个对象啊,如:Object obj = new Object();,然后在synchronized()中,放入对象obj。
回复 使用道具 举报
这是有关于线程同步的问题,使用ReentrantLock类的lock()和unlock()方法进行同步,希望能有帮助
回复 使用道具 举报
只要写个对象就行,静态同步代码快只能为.class。非静态的写个对象就行
回复 使用道具 举报
只是说静态同步函数的锁只能为类名.class.
并没有说同步函数不能用类名.class.
同步函数的锁要用对象,而类名.class也是一个对象

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

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