基础篇四

在学习过程中,我们短暂的接触到了wait和notify方法,知道了wait方法可以让当前线程暂停执行,等到被其他线程使用notify或notifyAll方法唤醒,或者被上节所说的interrupt方法中断状态,恢复执行。我们暂时还无法对这方法深究,但是我们需要了解的是,wait、notify和notifyAll方法不是线程方法,而是Object中的方法,也就是说,任何一个类中都会从Object继承到这些方法。关于这三个方法只能在同步方法中调用,这点应该不难理解,脱离了这个环境,它们就真正失去了意义。
多线程编程,使用同步机制进行控制是极其重要的一块内容。至于使用同步机制的原因,相信大家通过程涛老师所举的冉从俊两口子买鞋纠纷那个例子都能有个比较直观的感受,其实说的简单点,也就是多个线程在同一个时间操作同一个对象,如果没有同步控制,操作的结果往往会和预期效果偏离,对象可能会被修改到不合理。
Java中使用关键字synchronized关键字来实现同步机制。
synchronized关键字同步的内容也成为同步锁,这种说法很形象,按常理来说(不要抠字眼),一把钥匙对应一个门,拥有钥匙的人才有资格进入这个门。synchronized就像这个门,关着一些对于程序来说非常重要的内容和对象,只有先获得同步锁的线程能够执行synchronized中封锁的代码。使用完后要立刻归还这个同步锁,供其他线程使用。
同步锁可以用来锁对象:synchronized(Object o){},同步锁的作用仅仅局限于这个同步块,一旦出了这个大括号,同步锁将不再起作用。而且为了提高程序运行的效率,由于程序中需要同步的对象可能不止一个,而且他们会在不同的代码块中执行操作,所以我们需要使用不同的同步块来控制不同的同步对象,如synchronized(a){a++;}synchronized(b){b++;}这样不同的同步块可以同时执行。,不会造成不必要的时间等待。在我看来,synchronized(this)并不是一个好的书写方式,如果我们真的需要同步这个对象,我们完全可以将关键字写在方法名上,而如果同步的是当前对象的某个变量,那么我们直接将需要同步的变量作为同步锁,可以避免一些误解。
我们开始时提到wait、notify和notifyAll方法只能使用在同步方法中,那么现在我们开始具体学习下这三个方法。由于每个类都从Object中继承了这三个方法,所以我们可以在普通方法中直接调用wait方法,默认为this.wait()。
文中有这么一个例子:
class MyThread extends Thread{
Test t = new Test();
public void run(){
t.test();
System.out.println("Thread say:Hello,World!");
}
}
public class Test {
int x = 0;
public void test(){
if(x==0)
try{
wait();
}catch(Exception e){}
}
public static void main(String[] args) throws Exception{
new MyThread().start();
}
}
输出结果为:
F:\>java Test
Thread say:Hello,World!

我们调用了wait方法,但是为什么程序没有等待呢?我们之前不是说了wait方法必须要用在同步方法中,而且必须要有线程获得了同步方法的同步锁,这样wait方法才能被调用,所以在上述代码中如果我们将test方法改成public synchronized void test(),程序将会等待,而不会输出Hello,World这句话。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值