一、线程安全问题:
• 当多线程并发访问临界资源时,如果破坏原子操作,可能会造成数据不一致。 • 临界资源:共享资源(同一对象),一次仅允许一个线程使用,才可保证其正确性。 • 原子操作:不可分割的多步操作,被视作一个整体,其顺序和步骤不可打乱或缺省。 二、线程同步 (1) • 同步代码块: synchronized(临界资源对象){ //对临界资源对象加锁 //代码(原子操作) } 注:每个对象都有一个互斥锁标记,用来分配给线程的。 只有拥有对象互斥锁标记的线程,才能进入对该对象加锁的同步代码块。 线程退出同步代码块时,会释放相应的互斥锁标记 (2) ·同步方法 synchronized 返回值类型 方法名称(形参列表){ //对当前对象(this)加锁 // 代码(原子操作) } 注: 只有拥有对象互斥锁标记的线程,才能进入该对象加锁的同步方法中。 线程退出同步方法时,会释放相应的互斥锁标记。 三、同步规则 • 注意: • 只有在调用包含同步代码块的方法,或者同步方法时,才需要对象的锁标记。 • 如调用不包含同步代码块的方法,或普通方法时,则不需要锁标记,可直接调用。 • 已知JDK中线程安全的类: • StringBuffer • Vector • Hashtable • 以上类中的公开方法,均为synchonized修饰的同步方法。 经典问 四、经典问题 • 死锁: • 当第一个线程拥有A对象锁标记,并等待B对象锁标记,同时第二个线程拥有B对象锁 标记,并等待A对象锁标记时,产生死锁。 • 一个线程可以同时拥有多个对象的锁标记,当线程阻塞时,不会释放已经拥有的锁标 记,由此可能造成死锁。 • 生产者、消费者: • 若干个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和 消费者能并发执行,在两者之间设置一个能存储多个产品的缓冲区,生产者将生产的 产品放入缓冲区中,消费者从缓冲区中取走产品进行消费,显然生产者和消费者之间 必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个 满的缓冲区中放入产品。


