黑马程序员技术交流社区

标题: 线程的同步和互斥 [打印本页]

作者: 斗胆潇洒    时间: 2013-10-10 15:28
标题: 线程的同步和互斥
本帖最后由 斗胆潇洒 于 2013-10-10 23:12 编辑

在复习时,搜了下同步,又瞟到了互斥,
结果得知同步和互斥(不是异步)是有区别的,
再搜了些文档,同步和互斥更加纠结了,

那么我现在知道:
同步有协作关系,互斥有唯一性和排他性。
能来个些例子分析下吗?

虽然看了些解释,但还是觉得说的很模糊,那么求解:
两者的概念(或说是理解,通俗点啊)?
两者的区别?

我觉得视频中几个多线程的例子(同步的)是不是将同步和互斥都笼统的说成了同步了?

作者: 飘落    时间: 2013-10-10 15:33
个人理解,同步是指:同步代码块或同步方法中的代码是同步的,
互斥是指:多个线程对同步代码块或同步方法中的代码的访问是互斥的。
作者: 斗胆潇洒    时间: 2013-10-10 15:37
飘落 发表于 2013-10-10 15:33
个人理解,同步是指:同步代码块或同步方法中的代码是同步的,
互斥是指:多个线程对同步代码块或同步方法 ...

代码是同步的?怎么个同步法?
互斥的,怎么个互斥法,求深入啊......:dizzy:
作者: 斗胆潇洒    时间: 2013-10-10 18:14
牛 们啊,{:soso_e118:}
算了先吃饭去了,
试问论坛啥时间段,活人较多哈?
斑竹们有统计过吗,透露给我
那段时间我再来瞅瞅{:soso_e145:}{:soso_e146:}
作者: 飘落    时间: 2013-10-10 19:31
斗胆潇洒 发表于 2013-10-10 15:37
代码是同步的?怎么个同步法?
互斥的,怎么个互斥法,求深入啊...... ...

我的意思是:线程同步和线程互斥是一回事,只是从不同的角度说的。
这是我现阶段的理解,因为我看的几本书都只有以线程同步为标题的章节,
线程之间互斥是用来解释线程同步的。
作者: 曾振华    时间: 2013-10-10 19:47
例如访问同一个资源:例如车站的售票系统,一定是多个线程同时运行售票的吧。有编号为10000这张票,那么线程thread1正在卖它的时候,其余的线程就不能也卖这张票了。另一个就是著名的生产者-消费者问题。类比一下,老爸挣钱,打到银行卡里,儿子花钱。(假设卡里有钱的话就暂时不打钱)对于老爸老说,如果要打钱,查看一下卡,如果有钱,就暂时不放,并通知儿子已经有钱;如果没钱,当然就打钱了。对于儿子来说,取钱时如果有钱就取,如果没有就等待,并通知老爸没钱了。这就是同步了。
作者: a283398689    时间: 2013-10-10 21:05
在进行多线程编程时,难免还要碰到两个问题,那就线程间的互斥与同步:
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。

线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。
用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量。
下面我们来分别看一下这些方法:

作者: 云水禅心    时间: 2013-10-10 21:25
线程同步和线程不同步其实用生产者和消费者这个例子就很好解释了,

import java.util.concurrent.locks.*;
class ProducerConsumerDemo2
{
public static void main(String[] args)
{
  Resource r = new Resource();
  
  Producer pro = new Producer(r);
  Consumer con = new Consumer(r);
  Thread t1 = new Thread(pro);
  Thread t2 = new Thread(pro);
  Thread t3 = new Thread(con);
  Thread t4 = new Thread(con);
  
  t1.start();
  t2.start();
  t3.start();
  t4.start();
  
}
}
class Resource
{
private String name;
private int count = 1;
private boolean flag = false;

private Lock lock = new ReentrantLock();

private Condition condition_pro = lock.newCondition();
private Condition condition_con = lock.newCondition();

public void set(String name)throws InterruptedException
{
  lock.lock();//将同步替换成了lock操作。
  try
  {
   while(flag)   //定义while判断标记是因为要让被唤醒的线程再一次判断标记。
    condition_pro.await();
   this.name = name+"--"+count++;
   System.out.println(Thread.currentThread().getName()+"....生产者...."+this.name);
   flag = true;
   condition_con.signal();//实现了本方只唤醒对方的操作。
  }
  finally
  {
   lock.unlock();//释放锁的动作一定要执行。
  }
}
public  void out()throws InterruptedException
{
  lock.lock();
  try
  {
   while(!flag)
    condition_con.await();
   System.out.println(Thread.currentThread().getName()+"....消费者..........."+this.name);
   flag = false;
   condition_pro.signal();
  }
  finally
  {
   lock.unlock();
  }
}
}
class Producer implements Runnable
{
private Resource res;

Producer(Resource res)
{
  this.res = res;
}
public void run()
{
  while(true)
  {
   try
   {
    res.set("+商品+");
   }
   catch(InterruptedException e)
   {
   }
  }
}
}
class Consumer implements Runnable
{
private Resource res;

Consumer(Resource res)
{
  this.res = res;
}
public void run()
{
  while(true)
  {
   try
   {
    res.out();
   }
   catch(InterruptedException e)
   {
   }
  }
}
}
作者: 云水禅心    时间: 2013-10-10 21:31
同步需要锁,这个例子讲解的很透彻
作者: 斗胆潇洒    时间: 2013-10-10 22:22
曾振华 发表于 2013-10-10 19:47
例如访问同一个资源:例如车站的售票系统,一定是多个线程同时运行售票的吧。有编号为10000这张票,那么线 ...

:L
就是在查资料看到这么些例子,才说毕老师视频中对于线程同步的示例,是不是都笼统的说成同步了。
那么具体的区分,老师那个卖票的例子,就是互斥咯,生产者和消费者就是同步咯
作者: 斗胆潇洒    时间: 2013-10-10 22:26
a283398689 发表于 2013-10-10 21:05
在进行多线程编程时,难免还要碰到两个问题,那就线程间的互斥与同步:
线程同步是指线程之间所具有的一种 ...

又来了用户模式和内核模式:dizzy:.....
作者: 斗胆潇洒    时间: 2013-10-10 22:38
云水禅心 发表于 2013-10-10 21:31
同步需要锁,这个例子讲解的很透彻

。。。
非,同步和异步哦,
生产者和消费者的例子,应该是同步了,
我觉得其体现同步的关键点在于等待和唤醒机制,
像生产消费的例子,要想完成这么个任务,需要生产者和消费者共同合作,
没生产就没消费,且同步概念,我查阅得知同步的等待线程是有序的,那么我们知道
wait()的线程会放入线程池的等待队列中,其唤醒是从头到尾依次唤醒的,刚好满足有序。
作者: 斗胆潇洒    时间: 2013-10-10 23:12
谢谢各位了,虽说同步和互斥并不要区分那么清楚,但看到些题目问同步是什么,互斥是什么,区别又是什么?
后续自己再查了查,算是明白不少,辛苦各位了!




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