36. 解决线程问题方式一(同步代码块synchronized)

解决线程问题:

    方式一:同步代码块(synchronized)

        语法:

          synchronized ("锁对象") {
              //需要锁定的代码
           }

         解决线程安全问题原理:

          当我们使用同步代码块时,就当与给此段语句上了一个锁,当一个线程A进去的时候,锁的状态会从开变成关,后面的线程是进不来的。

          当进去的线程A执行完里面的代码时,锁的状态才会从关变成开,后面的线程才能进来。

        同步代码块需要注意事项:

          1.任何一个对象都可以作为一个锁对象

          2.在同步代码块中调用sleep对象并不是释放锁对象

          3.只有在正真需要使用代码块时才使用,否则会降低效率

          4.多线程操作的所对象必须时唯一共享的。否者无效

          5.锁住的代码最好是操作同一个共享资源的代码

        修改代码如下:

//模拟3个窗口同时售票
class SaleTicket extends Thread{
    //定义票数
    static int num = 50;
    public SaleTicket(String name) {
        super(name);
    }
    @Override
    public void run() {
        while (true) {
            if(num>0) {
                synchronized ("票数") {
                    System.out.println(Thread.currentThread().getName()+"买了"+num+"号票");
                    num--;
                }
            }else {
                System.out.println(Thread.currentThread().getName()+"票卖完了");
                break;
            }
        }
    }
}


public class Demo5 {
    public static void main(String[] args) {
        SaleTicket sale1 = new SaleTicket("窗口1");
        SaleTicket sale2 = new SaleTicket("窗口2");
        SaleTicket sale3 = new SaleTicket("窗口3");
        sale1.start();
        sale2.start();
        sale3.start();
        
    }
}

    

        

  

原文地址:https://www.cnblogs.com/zjdbk/p/8967547.html