(二)ConcurrentThread
1. 实际中, 10 个窗口卖票, 并发的安全性问题, 不能一张票卖给两个人
2. 电商中, 10 个手机, 一下卖出去了 50 个, 被 50 个人抢到了
3. 线程同步 (就是锁)
火车上厕所, 厕所是共享资源, 上厕所的人是并发的线程, 厕所只能嘘嘘 100 次
4. 针对线程并发安全性问题, 需要使用同步锁, 就是共享资源同时只能 1 个线程去访问
5. 共享资源同步锁代码块
synchronized(锁对象){
操作共享资源代码
}
6. 同步代码加在哪里
(1) 代码被多个线程访问
(2) 代码中有共享的数据
(3) 共享数据被多条语句操作
代码: SaleTicket_synchronized
- public class SaleTicket_synchronized extends Thread{
- private static int ticket=100;
- private String windowname;
- // 3. 增加同步锁对象资源
- private static Object obj=new Object();
- // 1. 创建一个构造方法, 便于给线程设置名字
- public SaleTicket_synchronized(String windowname) {
- super(windowname);
- this.windowname=windowname;
- }
- // 2. 重写 run 方法
- @Override
- public void run() {
- while(true) {
- // 4. 使用同步代码块
- synchronized (obj) {
- if(ticket>0) {
- // try {
- // Thread.sleep(10);
- // } catch (InterruptedException e) {
- // e.printStackTrace();
- // }
- System.out.println(this.getName()+": 正在卖第"+ticket+"张票");
- ticket=ticket-1;
- }else {
- System.out.println(this.getName()+": 已售罄");
- break;
- }
- }
- }
- }
- }
代码: Main_synchronized
- public class Main_synchronized {
- /**
- * 并发
- * 4 个窗口, 卖 100 张票
- * */
- public static void main(String[] args) {
- // 5. 创建 SaleTicket 对象
- SaleTicket_synchronized st1=new SaleTicket_synchronized("窗口 1");
- st1.start();
- SaleTicket_synchronized st2=new SaleTicket_synchronized("窗口 2");
- st2.start();
- SaleTicket_synchronized st3=new SaleTicket_synchronized("窗口 3");
- st3.start();
- SaleTicket_synchronized st4=new SaleTicket_synchronized("窗口 4");
- st4.start();
- }
- }
来源: http://www.bubuko.com/infodetail-2541128.html