一,线程之间的关系
线程之间存在两种关系:
(1)间接相互制约:相互争夺线程资源;
(2)直接相互制约:线程之间的相互合作;
间接相互制约也可以成为互斥,直接相互制约也可以称为同步;同步也包括互斥,互斥是一种特殊的同步。
二,线程同步的思想:
线程同步的主要任务是使并发对线程之间能够有效的共享资源和合作。
(1)互斥
多个线程互斥的资源应该放在同一个类中,用锁锁住该类,再用类来创建对象,在不同的线程中调用该类的资源,在一个线程访问时,另一个线程就不能访问该资源(被锁锁住的资源只能被一个线程访问),当一条线程访问完了,多条线程再次争夺资源。
(2)同步
线程之间的相互合作称为同步,多个线程之间相互协调,在互斥的基础上加一个布尔值,当线程调用同步资源的时候会先判断布尔值是否正确(既是否到自己执行了),是的会就继续执行,不是的话就使用Thread.wait(),等待另一个线程来执行同步资源,另一个线程执行完同步资源后,修改布尔值,再调用notify或者notifyAll方法唤醒等待锁的线程:
经验:要用到的共同数据(包括同步锁)的若干个方法因该用在同一个类身上,这种设计也刚好体现了高内聚和程序的健壮性。
注意:两个线程要执行的代码片段要实现互斥,则它们必须使用同一个锁对象,既锁要上在同步资源类的方法上,而不是线程的代码里,注意,判断布尔值是一定要在synchronized方法里或者synchronized代码块里,如果是使用代码块,使用wait,notifyAll,notify是一定是要使用锁住的那个对象来调用方法,如果是synchronized方法,那么它指向的是类创建的那个对象。
判断布尔值时可以使用if或者是while,但是建议使用while,因为有时候线程被伪唤醒,既没有被通知就自己醒来,这时候使用while可以继续判断布尔值是否正确,但是使用if的话在线程陷入沉睡前已经判断了一次,不会再判断了,而是继续向下执行,造成错误。