线程的同步与死锁

线程同步与死锁

1.内键锁synchronized:JDK1.0 作为关键字提供的同步方法

a.同步代码块:推荐使用,锁粒度较细
使用内键锁syschronized作用于方法中,
  syschronized(this) {//表示当前对象
        //需要同步的代码块
    }
b.同步方法
使用内键锁synchronized作用于方法头,同一时刻只有一个线程能进入此方法
  public synchronized void sale() {

    }

!!c.关于内键锁synchronized的说明
实际上synchronized(this)方法,以及非static的synchronized方法,
只能防止多个线程同时执行【同一个对象的同步代码段】。

即synchronized锁住的是括号里的对象,而不是代码。
非static的synchronized(this)方法也叫对象锁,锁的对象本身即this

【锁的是对象】,所以试衣房间门上锁后,里面的所有东西都只能一个线程使用,
即使只是使用了试衣间里的一小块地方,但是其他地方别的线程也不可以使用。

d.对象锁与全局锁
对象锁:默认是对象锁,锁的是当前对象,而非代码段
全局锁:锁的是真正的代码段,与对象无关!
全局锁的两种方法:
    1)在同步代码段,锁Class对象
    2)使用static synchronized 方法

2.JDK1.5 Lock锁(仍然为对象锁)

 private Lock ticketLock = new ReetrantLock();

3.死锁

死锁的本质:共享资源的循环等待
对于共享资源的上锁,注意不要成“环”

4.ThreadLocal

5.!!生产消费者模型

生产-消费者之间并不直接通讯,借助阻塞队列来通讯。
【生产者】生产完放到【阻塞队列】,而后【消费者】从阻塞队列取走商品。

1)wait():Object类

a.wait():痴汉方法,使线程暂停,会释放锁。需要和synchronized方法共同使用
b.如果调用wait()时:wait只能在同步代码块和同步方法中调用,

2)notify():Object类

a.notify也要在同步代码块和同步方法中调用。通知可能等待该对象的线程,
将其唤醒。若同一时刻有多个线程在wait(),notify随机选取一个线程唤醒。
b.notify()不会立即释放对象锁,需要notify执行完毕后才释放。

请解释sleep()与wait()的区别:

1. sleep()是Thread类中定义的方法,到了一定的时间后该线程自动唤醒,不会释放对象锁。 
2. wait()是Object类中定义的方法,要想唤醒必须使用notify()、notifyAll()方法才能唤醒,会释放对象锁

猜你喜欢

转载自blog.csdn.net/qq_39026129/article/details/81262847
今日推荐