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();
        
        
    }
}
原文地址:https://www.cnblogs.com/wgDream/p/7308721.html