解决线程问题:
方式一:同步代码块(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