• JavaSE部分 (多线程下)


    写在前面:分享技术,共同进步,把之前写的笔记搬运至博客,*有不足请见谅,相关意见可评论告知 (≧∇≦)ノ

    编程路漫漫,学习无止尽!

    线程同步

    在这里插入图片描述
    在这里插入图片描述

    三大线程不安全案例

    一、多人同时抢票问题

    在这里插入图片描述

    二、银行存款问题

    在这里插入图片描述

    package ThreadProcessStudy.ThreeSync;
    
    public class UnsafeBank {
        public static void main(String[] args) {
           Account account = new Account(100,"结婚基金");
    
            Drawing you1 = new Drawing(account,50,"you1");
            Drawing you2 = new Drawing(account,100,"you2");
    
            you1.start();
            you2.start();
        }
    }
    class Drawing extends Thread{
        Account account ;
        int drawingMoney ;
        int nowMoney;
    
        public Drawing( Account account ,int drawingMoney,String name){
            super(name);
            this.account = account;
            this.drawingMoney = drawingMoney;
    
        }
        @Override
        public  void run(){
            if(account.money-drawingMoney<0){
                System.out.println(Thread.currentThread().getName()+"钱不够");
                return;
            }
            // sleep可以放大问题
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            account.money = account.money - drawingMoney;
            nowMoney = nowMoney + drawingMoney;
            System.out.println(account.name+"余额为"+account.money);
            System.out.println(this.getName()+"手里得钱"+nowMoney);
        }
    
    
    }
    // 账户
     class Account {
        int money ; // 余额
        String name ;
    
        public Account(int money, String name) {
            this.money = money;
            this.name = name;
        }
    
    
    }
    
    

    三、同时添加集合问题

    在这里插入图片描述

    同步方法

    在这里插入图片描述

    同步块

    在这里插入图片描述
    银行取钱举例

    死锁

    在这里插入图片描述

    package ThreadProcessStudy;
    
    public class DeadLock {
        public static void main(String[] args) {
            Makeup g1 = new Makeup(0,"灰姑娘");
            Makeup g2 = new Makeup(0,"白雪公主");
    
            g1.start();
            g2.start();
    
        }
    }
    
    class Lipstick{
    
    }
    
    class Mirror{
    
    }
    
    class Makeup extends Thread{
        static Lipstick  lipstick= new Lipstick();
        static Mirror mirror = new Mirror();
    
        int choice ;
        String girl ;
    
        public Makeup( int choice, String girl) {
            this.choice = choice;
            this.girl = girl;
        }
    
        @Override
        public void run(){
           // 化妆
            try {
                makeuo();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        // 化妆,互相持有对方的锁,级需要拿到对方的资源
        private void makeuo() throws InterruptedException {
            if(choice ==0){
                synchronized (lipstick){  // 获得口红的锁
                    System.out.println(this.girl+"获得口红的锁");
                    Thread.sleep(1000);
    
    //                synchronized (mirror){  // 一秒后想获得镜子的锁
    //                    System.out.println(this.girl+"获得镜子的锁");
    //                        ****注意这样放在代码块里面就形成死锁
    //                }
                }
                synchronized (mirror){  // 一秒后想获得镜子的锁
                    System.out.println(this.girl+"获得镜子的锁");
    
                }
            }else{
                synchronized (mirror){  // 一秒后想获得镜子的锁
                    System.out.println(this.girl+"获得镜子的锁");
                    Thread.sleep(2000);
                }
                synchronized (lipstick){
                    System.out.println(this.girl+"获得口红的锁");
    
                }
            }
        }
    }
    
    

    输出结果:
    在这里插入图片描述

    死锁的避免方法

    在这里插入图片描述

    Lock(锁)

    在这里插入图片描述
    在这里插入图片描述

    加锁前代码:

    package ThreadProcessStudy;
    
    public class TestLock {
        public static void main(String[] args) {
            TestLock2 testLock2 = new TestLock2();
    
            // 模拟三个线程同时操作一个对象
            new Thread(testLock2).start();
            new Thread(testLock2).start();
            new Thread(testLock2).start();
        }
    }
    
    class TestLock2 implements  Runnable{
    
        int ticketNums = 10;
        @Override
        public void run() {
            while(true){
                if(ticketNums >= 0) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"拿到"+ticketNums--);   //注意分割符的位置
                }else{
                    break ;
                }
    
            }
        }
    }
    
    

    输出结果:
    在这里插入图片描述
    在这里插入图片描述

    加锁后:
    在这里插入图片描述

    synchronized 与Lock的对比

    在这里插入图片描述

    生产者消费者问题

    在这里插入图片描述
    通信问题
    在这里插入图片描述

    方法一:

    在这里插入图片描述

    方法二:

    在这里插入图片描述

    线程池

    在这里插入图片描述

    在这里插入图片描述
    代码实列
    在这里插入图片描述

    写在最后:全栈方向,前端已经大部分学完,将会以复习的形式出现在博客,大家敬请期待哈~

  • 相关阅读:
    按日期重命名宾得相机的照片
    Intellij笔记
    quartznet笔记
    优秀的UI插件
    我的ORM之示例项目
    Redis笔记
    Idol之坑
    ORACLE查询表最近更改的数据 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
    如何drop大表的中不用的字段 set unused column
    Oracle DUL/AUL/ODU 工具说明
  • 原文地址:https://www.cnblogs.com/lzhCreate/p/13334216.html
Copyright © 2020-2023  润新知