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

it2022-05-06  13

解决线程问题:

    方式一:同步代码块(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


最新回复(0)