线程安全-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 }

 

posted on 2020-08-10 21:14  落华12580  阅读(94)  评论(0)    收藏  举报

导航