线程的(同步synchronized)控制

线程的(同步)控制  

  一个Java程序的多线程之间可以共享数据。当线程以异步方式访问共享数据时,有时候是不安全的或者不和逻辑的。比如,同一时刻一个线程在读取数据,另外一个线程在处理数据,当处理数据的线程没有等到读取数据的线程读取完毕就去处理数据,必然得到错误的处理结果。这和我们前面提到的读取数据和处理数据并行多任务并不矛盾,这儿指的是处理数据的线程不能处理当前还没有读取结束的数据,但是可以处理其它的数据。

  如果我们采用多线程同步控制机制,等到第一个线程读取完数据,第二个线程才能处理该数据,就会避免错误。可见,线程同步是多线程编程的一个相当重要的技术。

  在讲线程的同步控制前我们需要交代如下概念:

  1  用Java关键字synchonized同步对共享数据操作的方法

  在一个对象中,用synchonized声明的方法为同步方法。Java中有一个同步模型-监视器,负责管理线程对对象中的同步方法的访问,它的原理是:赋予该对象唯一一把'钥匙',当多个线程进入对象,只有取得该对象钥匙的线程才可以访问同步方法,其它线程在该对象中等待,直到该线程用wait()方法放弃这把钥匙,其它等待的线程抢占该钥匙,抢占到钥匙的线程后才可得以执行,而没有取得钥匙的线程仍被阻塞在该对象中等待。

  file:// 声明同步的一种方式:将方法声明同步

  class store

   {

    public synchonized void store_in()

    {

      ….

    }

    public synchonized void store_out(){

       ….}

    }

  

    2. synchonized方法和synchonized块

  线程X中调用a对象的synchonized方法func(),自动等待并获取要获取a对象的锁,方法退出(正常退出或抛出异常退出)时自动释放a对象的锁。这里有个很好的特性,获取和释放锁都是自动进行的,不会出现忘记释放锁的情况。

  synchonized块是synchonized方法的扩展,它获取的是synchonized块所指定的对象的锁,synchonized方法相当于synchonized(this)。synchonized块的好处是可以将一个对象作为锁在多个地方使用。

  3. Object类的wait() notify() notifyAll()

  如果说synchonized是用来做线程同步的,那么Object类的wait() notify() notifyAll()就是用来做线程间通信的。

  需要特别注意的是,调用这3个方法之前都要在对应对象的synchonized方法或synchonized块中进行,否则会出现异常。

  调用对象m的wait()会使当前线程Y等待,4中情况可能使等待退出:a.wait超时 b.m的notify被调用 c.m的notifyAll被调用 d.线程Y的interrupt被调用。处理第一种都会有InterruptedException异常抛出,因此wait调用需要catch InterruptedException.

  常见用法:生产者消费者队列,消费者发现队列q为空时调用q.wait(),生产者向队列加入一个元素后调用q.notifyAll(),此时消费者可以被唤醒

  4. Thread类的sleep() interrupt() isInterrupt() interrupted()

  可以调用它Thread.sleep()使当前线程睡眠一段时间。

  线程Z在睡眠、等待事件、等待IO时,外部可能需要提前唤醒线程Z,这种情况下调用Z的interrupt()即可将它从等待中唤醒,Z线程会收到InterruptedException.

  值得一提的是,如果线程在正常工作(非上述的等待状态,如在一个循环中做加法),interrupt()是不能打断它的工作的。如果线程需要知道外界是否调用interrupt(),可以通过isInterrupt()检查。而interrupted()是检查当前线程的isInterrupt()状态并清除状态。www.examw.com

  5. volatile变量

  volatile变量解决的是这样一个问题:Java中多个线程共享的一个变量,某个线程更新该变量后,其他线程不能保证立即读到最想新的值。

  将某个变量声明为volatile,可以保证某个线程对它的修改,后续其他线程读到的都是最新值。

  6. atomic变量

  atomic变量解决的是另一个问题:Java不保证多线程同时写共享的long, double是原子的,可能出现奇异的值。另外,++或——这种其实是两步的操作就更不能保证原子了。

  volatile同时有atomic变量的第一个特性,写原子的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值