zoukankan      html  css  js  c++  java
  • Java进阶知识查漏补缺04

    Java中4种解决线程同步的方法:

    1.该方法是通过实现Runnable接口创建进程 + synchronized代码块解决进程安全问题

    package com.cjf.Thread;
    
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * Author: Everything
     * Date: 2020-07-01
     * Time: 18:18
     */
    
    //               解决线程安全问题,使用线程同步机制,只要一个线程执行不完,另一个就无法执行
    
    //    方式一:同步代码块
    //      synchronized(同步监视器){
    //              需要被同步的代码
    //        }
    //   说明: 1. 操作共享数据的代码,即为需要被同步的代码
    //        2.共享数据:多个线程共同操作的变量。比如: ticket 就是共享数据。
    //        3.同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。
    //   要求:多个线程必须要共用同一把锁。
    
    
        //该方法是通过实现Runnable接口创建进程 + synchronized代码块解决进程安全问题
    class Window2 implements Runnable{
    
        private  int ticket=100;
    
        @Override
        public void run() {
            while (true){
                synchronized (this){if (ticket > 0){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    ticket--;
                    System.out.println(Thread.currentThread().getName()+"售出车票,余票为"+ticket);
    
                }else {
                    break;
                }
            }}
        }
    }
    
    public class WindowTest1 {
        public static void main(String[] args) {
            Window2 window21 = new Window2();
            Thread thread1 = new Thread(window21);
            Thread thread2 = new Thread(window21);
            Thread thread3 = new Thread(window21);
            thread1.setName("一号售票口");
            thread2.setName("二号售票口");
            thread3.setName("三号售票口");
            thread1.start();
            thread2.start();
            thread3.start();
    
    
        }
    }

    2.该方法是通过继承Thread类创建进程 + synchronized代码块解决进程安全问题

    package com.cjf.Thread;
    
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * Author: Everything
     * Date: 2020-07-01
     * Time: 18:49
     */
    
    //该方法是通过继承Thread类创建进程 + synchronized代码块解决进程安全问题
    class Window extends Thread{
        //此时必须引入静态,让三个线程实例共用一个变量
        //一提到共享问题,就要想到静态
        private static int ticket=100;
        private static Object object = new Object();
    
        @Override
        public void run() {
            while (true){
                synchronized (object){
                if (ticket > 0){
                    try {
                        sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    ticket--;
                    System.out.println(Thread.currentThread().getName()+"售出车票,余票为"+ticket);
    
                }else {
                    break;
                }
            }}
        }
    }
    
    
    
    
    public class WindowTest2 {
        public static void main(String[] args) {
            Window window1 = new Window();
            Window window2 = new Window();
            Window window3 = new Window();
            window1.setName("售票窗口一");
            window2.setName("售票窗口二");
            window3.setName("售票窗口三");
            window1.start();
            window2.start();
            window3.start();
        }
    
    }

    3.该方法是通过继承Thread类创建进程 + synchronized方法解决进程安全问题

    package com.cjf.Thread;
    
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * Author: Everything
     * Date: 2020-07-01
     * Time: 19:32
     */
    
    
    //  关于同步方法的总结:
    //1.同步方法仍然涉及到同步监视器,只是不需要我们显式的声明。
    //2.非静态的同步方法,同步监视器是: this
    //  静态的同步方法,同步监视器是:当前类本身window2.class
    
    //该方法是通过继承Thread类创建进程 + synchronized方法解决进程安全问题
    class Window3 extends Thread{
        //此时必须引入静态,让三个线程实例共用一个变量
        //一提到共享问题,就要想到静态
        private static int ticket=100;
        private static Object object = new Object();
    
        @Override
        public void run() {
            while (true){
            show();
    
        }
    }
    
    
    
     private static synchronized void show(){
        if (ticket > 0){
            try {
                sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            ticket--;
            System.out.println(Thread.currentThread().getName()+"售出车票,余票为"+ticket);
    
        }
    }
    }
    
    
    
    
    
    
    public class WindowTest3 {
        public static void main(String[] args) {
            Window3 window31 = new Window3();
            Window3 window32 = new Window3();
            Window3 window33 = new Window3();
            window31.setName("售票窗口一");
            window32.setName("售票窗口二");
            window33.setName("售票窗口三");
            window31.start();
            window32.start();
            window33.start();
        }
    
    }

    4.该方法是通过实现Runnable接口创建进程 + synchronized方法解决进程安全问题

    package com.cjf.Thread;
    
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * Author: Everything
     * Date: 2020-07-01
     * Time: 19:46
     */
    
    //该方法是通过实现Runnable接口创建进程 + synchronized方法解决进程安全问题
    class Window4 implements Runnable {
    
        private int ticket = 100;
    
        @Override
        public void run() {
            while (true) {
                show();
            }
    
        }
        private synchronized void show(){
            if (ticket > 0){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                ticket--;
                System.out.println(Thread.currentThread().getName()+"售出车票,余票为"+ticket);
    
            }
        }
        }
    
    
    public class WindowTest4 {
        public static void main(String[] args) {
            Window4 window41 = new Window4();
            Thread thread41 = new Thread(window41);
            Thread thread42 = new Thread(window41);
            Thread thread43 = new Thread(window41);
            thread41.setName("一号售票口");
            thread42.setName("二号售票口");
            thread43.setName("三号售票口");
            thread41.start();
            thread42.start();
            thread43.start();
    
    
        }
    }
  • 相关阅读:
    .net jquery ajax应用(后台)
    .net jquery ajax应用(前端)
    echarts 添加Loading 等待。
    js将数字转换为带有单位的中文表示
    关于Pre-bound JDBC Connection found! HibernateTransactionManager does not 异常小结
    java 并发容器一之ConcurrentHashMap(基于JDK1.8)
    java 并发容器一之BoundedConcurrentHashMap(基于JDK1.8)
    23中java设计模式(1)-- 策略模式
    解决Eclipse自动补全变量名的问题
    Tomcat+Jenkins+SonarQube+SVN+Maven 集成自动化环境搭建(Windows10环境下)
  • 原文地址:https://www.cnblogs.com/cuijunfeng/p/13222418.html
Copyright © 2011-2022 走看看