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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 傅宇 中级黑马   /  2012-11-21 15:02  /  1484 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 不会耍筷子 于 2012-11-21 16:36 编辑

class StopThread implements Runnable
{
        private boolean flag = true;
        public void run()
        {
                while(flag)
                {
                        try
                        {
                                wait();
                        }
                        catch (InterruptedException e)
                        {
                                System.out.println(Thread.currentThread().getName()+"......"+e);
                        }
                        System.out.println(Thread.currentThread().getName()+"......");
                }
        }
        public void setFlag()
        {
                flag = false;
        }
}
class StopThreadDemo
{
        public static void main(String[] args)
        {
                StopThread st = new StopThread();
                Thread t1 = new Thread(st);
                Thread t2 = new Thread(st);
                t1.start();
                t2.start();
                int num = 1;
                for(;;)
                {
                        if(++num == 50)
                        {
                                st.setFlag();
                                break;
                        }
                        System.out.println("main...."+num);
                }
                System.out.println("over");
        }
}
求高手帮我分析下run方法加synchronized与不加synchronized之间的区别,我想问的不是同步代码块,是为什么同样都是wait,一个会抛异常而一个不会抛异常?我知道加了同步之后0线程和1线程都会在wait那冻结,所以程序结束不了,而没加同步,wait不是同样把0线程和1线程冻结了,为什么这时就会抛出异常结束程序?








评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
synchronized是解决线程安全问题的需要,加了synchronized在这段代码执行过程中其他线程不能访问,以防止共享数据错乱的情况。不过具体情况还需要具体对待~
回复 使用道具 举报
你百度一下就OK啦
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
回复 使用道具 举报
加上synchronized修辞的方法,当一个线程调用它的时候其他的线程不需等待(可以保证同步)。而不加synchronized修辞的方法当一个线程调用他的时候另一个线程也可以调用它的(是不同步的)。
举例吧:买火车票 2个窗口卖 假定有张票的ID为80 如果没有synchronized这个锁来控制 那有可能导致2个窗口同时都把ID为80的这张票卖出去 这不乱套了嘛 那不就有2张ID为80的票了?有了synchronized就只有当一个窗口卖完了 释放了synchronized这个锁 其他窗口才能来卖票 这时ID为80的票已经被卖出去了 也就只能卖其他的了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马