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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高廷平 中级黑马   /  2012-8-27 14:25  /  2162 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package Demo_Test;
public class Demo_Thread {
public static void main(String[] args) {
  //同步
  new Thread(new MyThread_synchronized()).start();
  
  
  /*创建匿名线程对象*/
  Thread td=new Thread(new Runnable(){
   public void run()
   {
    for(int i=0;i<5;i++)
    {
     System.out.println("匿名线程正在运行"+i);
    }
   }
  });
        td.start();
}
}

class  MyThread_synchronized implements Runnable
{     
public  void run()
{
   synchronized(new Object())//同步代码块
     {     
    for(int i=0;i<50;i++)
   {
    System.out.println("同步:MyThread_implements线程正在运行"+i);
   }
     }
}
}
结果:
同步:MyThread_implements线程正在运行0
匿名线程正在运行0
同步:MyThread_implements线程正在运行1
匿名线程正在运行1
匿名线程正在运行2
匿名线程正在运行3
匿名线程正在运行4
同步:MyThread_implements线程正在运行2
同步:MyThread_implements线程正在运行3
              ......
有点不懂: for(int i=0;i<50;i++){...}处在同步块中,为什么还会出现上面的运行结构啊????
           个人理解:
                 for(int i=0;i<50;i++)
   {
    System.out.println("同步:MyThread_implements线程正在运行"+i);
   }
           在同步块中,应该执行完后其它线程才运行的啊!
           求赐教!

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
在同步块中,应该执行完后其它线程才运行的啊!
这句话是错误的,这是2个线程,且这2个线程执行各自的的方法,并没有互相执行同一个方法。同步代码块的意思是不允许在一个线程还没执行完这个代码快的时候另一个线程进来执行这个代码块,并没有说不能执行其它方法,只是不能执行同步代码快的方法而已。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
{:soso_e100:}有点理解了!
回复 使用道具 举报
同步使用的前提:
1,必须是两个或者两个以上的线程。
2,必须是多个线程使用同一个锁。
这样才可以称为这些线程被同步了。


楼主只对一个线程写了sychronized代码块,没有满足前提中的第一条,因此不是同步线程。
回复 使用道具 举报
本帖最后由 应广驰 于 2012-8-27 19:24 编辑

你在代码中创建了两个线程,一个是MyThread_synchronized类的,还有一个是主程序中的匿名内部类的,并没有运行同一个,没有共享数据,synchronized加不加都一样
回复 使用道具 举报
本帖最后由 RWJ2012 于 2012-8-27 19:28 编辑

要实现线程同步,首先要用同一个锁对象,下面是对这个程序的改进,符合楼主的要求,可以参考下。
package Demo_Test;

public class Demo_Thread {
        
        public static void main(String[] args) {
                final MyThread_synchronized myThread = new MyThread_synchronized();
                // 同步
                //new Thread(new MyThread_synchronized()).start();
                new Thread(myThread).start();

                /* 创建匿名线程对象 */
                Thread td = new Thread(new Runnable() {
                        public void run() {
                                synchronized (myThread) {//要实现同步也要用MyThread_synchronized的实例对象做为同步锁对象
                                        for (int i = 0; i < 5; i++) {
                                                System.out.println("匿名线程正在运行" + i);
                                        }
                                }
                        }
                });
                td.start();
        }
}

class MyThread_synchronized implements Runnable {
        public void run() {
                //synchronized (new Object());
                synchronized (this)//当前对象做为锁对象
                {
                        for (int i = 0; i < 50; i++) {
                                System.out.println("同步:MyThread_implements线程正在运行" + i);
                        }
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

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