零EVA

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

多线程的运行出现了安全问题

原因:

  当多条语句在操作同一个线程数据的时候,一个线程对多条语句只执行了一部分,还没执行完

  另一个线程参与进来执行,导致共享数据的错误

 

解决办法:

  对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其它线程不可以参与执行。

 

JAVA对于多线程安全问题,提供了专业的解决方式

就是同步代码块

synchronized(对象)

{

  需要被同步的代码

}

对象如同锁,持有锁的线程可以在同步中执行

没有持有锁的线程即使获取CPU的执行权,也进不去

 

同步的前提

  1 必须要有至少两个线程

  2 必须多个线程使用同一个锁

必须保证同步中只有一个线程在运行

 

好处:解决多线程的安全问题

弊端:多个线程都需要判断锁,较为消耗资源

 1 class Ticket implements Runnable//extends Thread
 2 {
 3     private int tick = 100;
 4     Object obj = new Object();
 5     public void run()
 6     {
 7         while(true)
 8         {
 9             synchronized(obj)
10             {
11                 if(tick>0)
12                 {
13                     try{Thread.sleep(10);}catch(Exception e){}
14                     System.out.println(Thread.currentThread().getName()+"sales : "+tick--);
15                 }
16             }
17         }
18     }
19 }
20 class Demo
21 {
22     
23     public static void main(String[] args)
24     {
25         Ticket t = new Ticket();
26         Thread t1 = new Thread(t);
27         Thread t2 = new Thread(t);
28         Thread t3 = new Thread(t);
29         Thread t4 = new Thread(t);
30         t1.start();
31         t2.start();
32         t3.start();
33         t4.start();
34         /*
35         Ticket t1 = new Ticket();
36         Ticket t2 = new Ticket();
37         Ticket t3 = new Ticket();
38         t1.start();
39         t2.start();
40         t3.start();
41         */
42         //System.out.println("");
43     }
44 }
View Code

 

posted on 2017-06-19 18:00  零EVA  阅读(127)  评论(0编辑  收藏  举报