zoukankan      html  css  js  c++  java
  • Java-jdk1.4解决多线程同步问题两种实现方式-同步函数和同步代码块关键字synchronized

    class Ticket implements Runnable {
        //1.描述票的数量
        private int tickets = 100;
        
        //2.售票的动作,这个动作需要被多线程执行,那就是线程任务代码,需要定义run方法中
        //线程任务中通常都有循环结构
        
        private Object obj = new Object();
        public void run() {
            /*
            //使用同步代码块解决多线程安全问题
            synchronized(obj) {
                while (true) {
                    if (tickets > 0) {
                        System.out.println(Thread.currentThread().getName() + "  "+ tickets--);
                    }
                }
            }
            */
            
            while(true) {
                this.sale();
            }        
        }
        //解决多线程安全问题第二种方式通过同步函数
        /*
            同步函数使用的锁是固定的this,当线程任务需要一个同步时可以使用同步函数
            同步代码块使用的锁可以是任意一个对象,当线程任务需要多个同步时,必须通过锁来区分,这时只能使用同步代码块了
            
        */
        public synchronized void sale() {
            if (tickets > 0) {
                try{Thread.sleep(10);}catch(InterruptedException e){}
                System.out.println(Thread.currentThread().getName() + "  "+ tickets--);
            }
        }
    }
    
    
    public class ThreadDemo3 {
        public static void main(String[] args) {
            //1.创建Runnable接口的子类对象
            Ticket t = new Ticket();
            //2创建4个线程对象,并将Runnable接口的子类对象作为参数传递给Thread的构造函数
            Thread t1 = new Thread(t);
            Thread t2 = new Thread(t);
            Thread t3 = new Thread(t);
            Thread t4 = new Thread(t);
            
            //3.开启4个线程
            t1.start();
            t2.start();
            t3.start();
            t4.start();
            
            
        }
    }
  • 相关阅读:
    es6之更优雅的条件语句
    html 提取 公用部分
    jQuery 新添加元素事件绑定无效
    关于ie6块元素行内元素转换
    git 入门级使用
    vim入门级使用
    git安装配置
    学习使用mac
    Angular常用标记
    npm/bower/brew
  • 原文地址:https://www.cnblogs.com/wgDream/p/7308721.html
Copyright © 2011-2022 走看看