线程
一:线程互斥
并发访问的线程加上同步锁之后就称为线程互斥。
谁抢到了对象锁的线程就先执行。
没有抢到对象锁的线程就等待对象锁。
加同步锁,加在共享对象上。
每一个对象都有唯一的一把锁。
lock对象锁---->执行代码------>unlock对象锁
synchronized(共享区){临界区}
共享区:多线程同时操作同一个对象
临界区:多线程对共享区进行操作的代码区
synchronized可以放在方法上,就是一个同步方法。
将所有影响的方法都定义成线程安全的方法就变成了线程安全的类。
线程安全的类—效率低
二:线程的通信—>线程同步(操作的也是同一个对象)
线程互斥谁先抢到对象锁就谁先执行(如抛绣球)。
线程同步会控制线程执行的先后顺序。
线程同步线程会有依赖关系。
线程通信的步骤:
1)找到共有对象。
2)wait(),notify(),notifyAll()—Object类中的方法。
需要对同一个资源等待,唤醒才有效。
是针对对象进行等待和通知。这些方法一定要放在
synchronized关键字中,用来保护共有资源。
生产者生成产品之后通知消费者–notify
消费者等待生产者生产产品—wait
3)保证wait()执行在notifyAll()方法的前面.使用标志变量。
notifyAll()之前先判断有没有线程在等待。
如果有就通知,没有就小睡一下只有有等待线程出现。
sleep():不会释放对象锁。
wait():让当前线程进入等待状态,会释放对象锁。
notify():通知等待中的某个线程进入到就绪状态。会释放对象锁。
notifyAll():通知等待中的所有线程进入到就绪状态。会释放对象锁。
yeild():不会释放锁,让出当前线程。进入就绪状态
临界区执行完毕:释放锁
临界区代码执行过程中遇到Error Exception释放
临界区代码执行过程中出现return,break 释放锁
三:线程的死锁
多个线程同时操作多个对象很容易产生死锁。
解决方式:给多个对象加对象锁的时候。
将加锁的顺序保持一致,就可以避免死锁。