黑马程序员技术交流社区

标题: 多线程中同步操作和同时操作有什么不同之处? [打印本页]

作者: 黑马任雪刚    时间: 2012-5-3 00:10
标题: 多线程中同步操作和同时操作有什么不同之处?
多线程中同步操作和同时操作有什么不同之处?具体举个例子呗
作者: 何阳    时间: 2012-5-3 00:22
//多线程中同步操作和同时操作有什么不同之处?具体举个例子呗
//比如现在有10个一块的钱,让甲和乙自己处理
//同步操作  甲拿一块,然后乙拿一块,甲拿一次,已拿一次
//同时操作,那看谁厉害了,可能甲得4块,已得6块,很有可能他们还会打架
//在计算机中,cpu每次只能执行一个线程,做这快速切换的东西,我们不能觉察而已
//同步在java中用synchronized()来体现,括号中的是对象,相当于一把锁,每次
//只有一个人能够进去,

作者: 贾联国    时间: 2012-5-3 00:48
同步操作就是只允许一个线程运行,只有这个线程放弃运行权,其他的线程才能执行。
同时操作就是所有线程一起抢夺cpu的运行权,没有执行顺序和执行时间
作者: 崔仁军    时间: 2012-5-3 09:00
1 同步是指两个线程都要去访问这个对象   但是是有顺序的   一个线程先去执行就会对这个对象加锁 等执行完毕后对这个对象解锁之后下一个线程才能去访问这个对象;
2 同时也是指两个线程都去访问这个对象   但他们是没有顺序的  ,两个线程可以同时去访问他们。
3  比如去银行取款     如果账户只有1000 ,我们要取款800 一个在柜台取 一个在提款机取   如果是同步的话我们就只能一个取完了 另一个才去取   等另一个取的时候就会发现账户余额不足无法取款        如果是同时的话那么就可以同时去取     等第一个正在去的时候另外一个也在去    那么两个人都可以同时取800元     那账户就成了负600了     那银行不就亏惨了     写了如下代码
public class FetchMoney
{
        public static void main(String[] args)
        {
                Bank bank = new Bank();
               
                Thread t1 = new MoneyThread(bank); // 柜台
       
               
                Thread t2 = new MoneyThread(bank); // 取款机
               
                t1.start();
                t2.start();
        }
}
//  银行账户类
class Bank
{
        private int money = 1000;
       
        public synchronized int getMoney(int number)
        {
                if(number < 0)
                {
                        return -1;
                }
                else if(number > money)
                {
                        return -2;
                }
                else if(money < 0)
                {
                        return -3;
                }
                else
                {
                        try
                        {
                                Thread.sleep(1000);
                        }
                        catch (InterruptedException e)
                        {
                                e.printStackTrace();
                        }
                       
                        money -= number;
                       
                        System.out.println("left money: " + money);
                       
                        return number;
                }               
        }
}
class MoneyThread extends Thread
{
        private Bank bank;
       
        public MoneyThread(Bank bank)
        {
                this.bank = bank;
        }
       
        @Override
        public void run()
        {
                System.out.println(bank.getMoney(800));
        }
}

作者: 马超    时间: 2012-5-3 09:08
本帖最后由 依然小马哥 于 2012-5-3 23:16 编辑

同步操作 和 同时操作
同步操作的前提:其中的一个线程自动放弃了运行资格,这时候其他线程有序执行
同时操作,呵呵,将相当于是生活在罪恶都市中的人,横行霸道,你夺我抢,在线程中的表现形式就是他们争相抢夺CPU的运行资格。
可以这么说  ,“同时”所包括的范围要比“同步”大,画个图:
同步是加以约束的,而实现这个约束的就是同步代码块 和 同步函数 关键字:synchronized

1.JPG (18.81 KB, 下载次数: 60)

1.JPG





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