使用同步代码块解决继承Thread类的方式的线程安全问题
1 package com.atfu.java01; 2 3 /** 4 * 例子:创建三个窗口卖票,总票数为100张,使用继承Thread类的方式。 5 *存在线程安全问题,待解决。 6 * 7 *使用同步代码块解决继承Thread类的方式的线程安全问题 8 * 9 * 说明:在使用继承Thread类创建多线程的方式中,慎用this来充当同步监视器。考虑使用当前类来充当同步监视器。 10 * 11 * 12 * @author fu jingchao 13 * @creat 2021/10/17-14:59 14 */ 15 class Window2 extends Thread{ 16 private static int ticket = 100; 17 private static Object obj = new Object(); 18 @Override 19 public void run() { 20 21 while (true) { 22 // synchronized(obj) { 23 synchronized(Window2.class) {//Window2.class也是一个对象,只会加载一次;Class class = Window.class 24 //synchronized(this)是错误的方式:this代表着t1,t2,t3三个对象,锁不唯一。 25 if (ticket > 0) { 26 try { 27 Thread.sleep(100); 28 } catch (InterruptedException e) { 29 e.printStackTrace(); 30 } 31 System.out.println(getName() + ":卖票,票号为:" + ticket); 32 ticket--; 33 } else { 34 break; 35 } 36 } 37 } 38 } 39 } 40 41 public class WindowTest2 { 42 public static void main(String[] args) { 43 Window2 w1 = new Window2(); 44 Window2 w2 = new Window2(); 45 Window2 w3 = new Window2(); 46 w1.setName("窗口一"); 47 w2.setName("窗口二"); 48 w3.setName("窗口三"); 49 w1.start(); 50 w2.start(); 51 w3.start(); 52 } 53 }
此为本人学习笔记,若有错误,请不吝赐教

浙公网安备 33010602011771号