JAVA多线程同步解析

        线程同步由多线程执行原理内在要求的,进程是资源分配单位,一般由若干线程组成,线程之间可以共享数据区,但各个线程也有自己的状态和中间变量寄存器,互不干扰。在JAVA中,JVM对线程是这样管理的,当一个线程被创建时都将得到自己的程序记数器和Java栈,Java栈以帧为单位保存调用信息。当线程调用一个方法时,JVM会压如一新的栈帧到Java栈,反之则弹出。也就是说,JVM只会对Java栈执行两种操作:以帧为单位的压栈和弹栈。帧的大小根据调用信息是可变的。由于Java栈上的数据是此线程私有的,因此不需考虑多线程下的栈数据的线程安全问题。

       对于共享区(主要是共享对象造成的),如果没有同步标识,对于方法不是原子调用,完全是听天由命式的多线程并发处理,往往执行结果不是自己想要的数据。Java提供两种同步机制:同步块和volatile变量。同步块有两个方法:单纯synchoronized 和 wait-notify机制。

        为了保证线程的同步,引入了锁,线程会在线程池里加上lock信息。sychoronized它先把它的方法锁在家里,如果线程A第一个来,碰到线程中有sleep(5000000);这类代码,A离开,但是会带走钥匙,这样其它线程即使知道CPU资源可以使用,但就是执行不了。做事就是要有一个先后次序的,不遵守秩序,想怎么干就怎么干,这任务还怎么完成,java把synchorinized交给线程A,那就由A来制定规则。基本上是保证这synchoronized这块操作是个“原子”操作。这个线程完了之后,其它线程才有可能进来。而不是以A线程度过了几个时间片为准。这是防止死锁和脏数据一个最简单的方法,但是很不灵活。

       说到synchoronized,这个关键字,如果修饰方法,那么这个对象对此方法调用时被上锁。但也并不只局限于修饰整个方法体或者当前对象,也可以用来修饰方法体内部的某体执行语句和指定被锁对象:

public void f(){
   synchoronized(x){.....} //这里的执行体,是对对象x进行锁定的,也可以是this就是指本类对象。
                                       //注意这里如果要调用wait和notify时,必须用x.wait和x.notify。
                                      //如果是this的话,就直接使用wait()和notify()
   ........                         //这里的执行语句不受x对象锁的制约。
}

         还是另一种同步方法就是wait-notify机制,最经典的就是生产消费者问题。首先要注意的是wait和notify语句都是必须放在以synchronized关键字修饰的方法里,或者已经对对象和类进行了锁定块里,如果不然,抛出运行时异常:IllegalMonitorStateException。我是花了很长时间才理解,主要问题在于所谓的notify和wait都是指的这个对象的this.notify和this.wait,他们对同一对象进行操作,唤醒的肯定是这个对象里的另一个方法。 生产者把产品放在仓库里时,把外边的牌子换成“已有货”,生产者就不进行继续生产了,然后叫醒消费者提货,进行消费,他拿走后把牌子换成“货已空”,然后唤醒生产者继续。notify 仅只能唤醒的是最先wait 的那块代码,而notifyAll是唤醒所有,如果只有两个代码块,那么两者等效。这个两个方法是object类里定义的方法。notify和wait不能随处乱调用,而且必须在synchoronize语句块中。如果在代码块之外用的话,不会报错,但编译运行,即报错:IllegalMonitorStateException。

         volatile 是保证线程提取的这个变量是一致的,每次都是从内存中存取变量,而不是从缓存中。可以说这是程序较轻的synchronized

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值