线程安全-synchronized
synchronized (锁:同步监视器){
需要被同步的代码 :操作共享数据的代码
}
在继承自Thread类的时候 声明同步方法的方式谨慎使用,创建多个线程对象会有多把锁 可以通过将方法声明为static解决
MyThread th1,th2,th3
public stnchronized void test(){
}
锁是th1,th2,th3 即this
public stnchronized void test(){
}
锁是MyThread.class
//错误示例,while关键字被包含在synchronized关键字内,只会运行一个线程
1 public class window extends Thread{ 2 private static int ticket=100; 3 4 public void run(){ 5 while (true) { 6 7 8 synchronized (Thread.class) { 9 10 if (ticket > 0) { 11 System.out.println(getName() + "卖出了第" + ticket); 12 ticket--; 13 } else { 14 break; 15 } 16 } 17 } 18 19 20 21 } 22 23 public static void main(String[] args) { 24 window w1=new window(); 25 window w2=new window(); 26 window w3=new window(); 27 w1.start(); 28 w2.start(); 29 w3.start(); 30 } 31 }
修改后
1 /** 2 * @author lisa 3 * @create 2020-08-10-21:14 4 */ 5 public class RunnableTest { 6 public static void main(String[] args) { 7 runnable(); 8 9 } 10 static void runnable(){//这是一个内部类 11 12 Runnable r=new Runnable() {// 13 int ticket=100; 14 @Override 15 public void run() { 16 if (ticket > 0) {//满足条件进入同步 17 while (true) { 18 synchronized (this) {//可以创建一个类变量充当同步锁,多线程必须用同一个锁 19 20 21 if (ticket > 0) {//有可能多个线程通过验证。假如此时ticket=0就会出现-1,因此进一步验证 22 System.out.println(Thread.currentThread().getName() + "卖出了第" + ticket + "张票"); 23 ticket--; 24 25 try{ 26 Thread.sleep(100);//阻塞不会释放锁。其他线程即使调度到也没办法运行 27 } 28 catch (Exception e){ 29 e.printStackTrace(); 30 } 31 32 } else { 33 break; 34 } 35 36 37 } 38 } 39 } 40 } 41 }; 42 43 Thread th1=new Thread(r); 44 Thread th2=new Thread(r); 45 Thread th3=new Thread(r); 46 th1.start(); 47 th2.start(); 48 th3.start(); 49 50 } 51 }
浙公网安备 33010602011771号