黑马程序员-------多线程(二)

来源:互联网 发布:美工装修怎么上传 编辑:程序博客网 时间:2024/05/13 13:39

------- android培训java培训、期待与您交流! ----------

函数都要用对象调用,函数都有所属的对象引用this,同步函数使用的锁是this。

同步函数被静态修饰后使用的锁不是this,静态进内存时内存中没有本类对象,静态方法中也不能定义this,但一定有该类对应的字节码文件对象:类名.class,该对象的类型是Class。所以静态的同步方法使用的锁是该方法所在类的字节码文件对象:类名.class 。

死锁的原理:同步中嵌套同步而锁却不同。尽量避免死锁。


代码演示:



还记得之前说过的java设计模式里,我最先接触的就是单例设计模式了。

分为懒汉式和饿汉式。


代码演示:


懒汉式和饿汉式有什么不同?
  懒汉式的特点在于实例的延迟加载。
懒汉式的延迟加载有没有问题?
  有问题,当遇到多线程访问的时候,会出现安全问题。通过加同步来解决。
加同步的方式,有两种,一种是同步函数,一种是同步代码块。但是效率比较低。
用双重否定的方法来解决这个问题。


线程间通信:多个线程在操作同一个资源,但操作的动作不同。

等待唤醒机制:
wait(),notify(),notifyall() 这些方法都是用在同步中。因为要对持有监视器(锁)的线程操作,所以要使用在同步中。这些方法在操作同步中线程时都必须要标识它们所操作线程持有的锁,只有同一个锁上的被等待线程可以被同一个锁的notify唤醒。不可以对不同锁中的线程进行唤醒。也就是说,等待和唤醒必须是同一个锁。锁可以是任意对象,因此可以被任意对象调用的方法定义在Object类中。

wait()方法:导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。 wait方法有异常抛出,所以要cry{}catch(){}处理,绝对不能抛。


代码演示:


为什么定义notifuAll?
因为需要唤醒对方线程。
因为只用notify的话,容易出现只唤醒本方线程的情况。导致程序中所有的线程都冻结。


JDK 1.5中提供了多线程升级解决方案。将同步synchronized替换成显示的Lock操作。将Object中的wait、natify、

notifyAll替换成了Condition对象,该对象可以通过Lock锁进行获取。该示例中实现了本方只唤醒对方的操作。 

condition_pro.await()等待自己 ,condition_con.signal()唤醒对方。


代码演示:




0 0