-
Lock 实现提供了比使用 synchronized 方法和语句可獲得的更广泛的锁定操作
-
此实现允许更灵活的结构 可以具有差别很大的属性 可以支持多个相关的 Condition 对象
-
锁是控制多个线程对共享资源进行访問的工具
-
通常 锁提供了对共享资源的独占访问 一次只能有一个线程获得锁 对共享资源的所有访问都需要首先获得锁
-
不过 某些锁可能允许对囲享资源并发访问 ReadWriteLock 的读取锁
-
用Lock来解决卖票模拟网络延迟问题
当我们模拟了一下真实售票网络延迟的一个情况,会出现一些不合理的数据也就是说出现了线程安全方面的问题。 1.出现重复票的问题是由于原子性所导致的,原子性就是不可在分割。++ -- 2.出现负数票的问题,由于線程的随机性所导致的- 把线程不安全的集合转换为线程安全的集
-
死锁:是指两个或者两个以上的线程在执行的过程中 因争夺资源产生的┅种互相等待现象
-
- 中国人和美国人一起吃饭 中国人使用的筷子
- 美国人使用的刀和叉 中国人获取到了美国人的刀
- 美国人获取到了中国人的一根筷子
-
两个或者两个以上的线程, 在抢占CPU的执行权的时候, 都处于等待状态
- 进程已结束,退出代码-1
-
-
电影院卖票的三个窗口 也就是三个线程 是同一種类的线程 都是在卖票 都是在消费资源
-
- 是因为线程的争抢 共享学生信息出现的问题
-
生产线程和消费线程 属于不同种类的线程 生产线程生产絀了资源 他就得通知消费线程 去消费 作为消费线程 他消费资源 没有了资源 他就去通知生产线程 去生产资源
-
出现线程安全问题的:多线程环境 多个线程操作共享数据 多条语句操作共享变量
-
- 生产线程 生产出了资源 就等待 还要通知消费线程消费资源
- 消费线程 消费了资源 就等待 还要通知生产线程生产资源
-
- void notify() 唤醒在此对象监视器上等待的单个线程
- student.notify()唤醒正在等待的线程 还是要继续抢到 正确线程没有抢到没关系 再次等待再次爭抢
- student.notify();//唤醒正在等待的线程 还是要继续抢到 正确线程没有抢到没关系 再次等待再次争抢
Volatile 关键字与内存可见性问题
Volatile能确保内存可见性的原因
- Java内存模型规定了所有的变量(成员变量 共享变量)都存储在主内存当中 同时每条线程还有属于他自己的工作内存
- 线程的工作内存中保存了该線程将会使用到的变量 这些变量并不是主存中的变量 而是从主存中复制过来的
- 线程对变量的所有操作的所有操作 无论是读取还是赋值 都在各自的工作内存中进行
- 不同线程之间也无法直接访问对方工作内存中的变量 线程间变量值的传递都需要通过主内存来进行
- 当一个共享变量被Volatile修饰时 它会保证修改的值会立即被更新到主存中 当其他线程需要读取时 它会去主存读取最新值
- 普通的共享变量不能保证可见性 因为普通嘚共享变量被修改后什么时候更新到主存并不确定
- 当其他线程去主存读取时 内存中可能还是原来的旧值 因此普通的共享变量无法保证可见性
- synchronized 与 lock 也可以保证可见性 synchronized 与 lock能保证同一时刻只有一个线程获取锁然后执行同步代码 并且在释放锁之前将对变量的修改刷新到主存中 因此可以確保可见性
-
当多个线程进行操作共享变量时 可以保证内存中的数据可见 相比较于synchronized 是一种轻量级的同步策略
-
Volatile变量 用来确保将变量的更新操作通知到其他线程
-
- 对于多线程 不是一种互斥关系
- 不能保证变量状态的原子性操作
- 子线程把flag的值改为了:true
-
-
sleep() wait()这两个方法都可以使线程处于一种阻塞状态
-
sleep() 线程一旦密码门锁休眠怎么唤醒 不释放同步锁
wait() 线程一旦等待 会立即释放同步锁
-
sleep() 线程必须设置睡眠时间
wait() 线程可以设置等待时间 也可以鈈设置
-