多线程-安全2019/08/16

 1 public class beginning {
 2 
 3     private static final Runnable String = null;
 4 
 5     public static void main(String[] args) {
 6         Ticket t = new Ticket();                     // 创建一个Runnable对象
 7         Thread t1 = new Thread(t);                   //创建四个线程,同时跑Thread(可接收Runnable对象)
 8         Thread t2 = new Thread(t);
 9         Thread t3 = new Thread(t);
10         Thread t4 = new Thread(t);
11         t1.start();
12         t2.start();
13         t3.start();
14         t4.start();
15 
16     }
17 }
18 
19 class Ticket implements Runnable
20 {
21     private  int tick = 100;
22     public void run()
23     {
24         while (true)
25         {
26             if(tick > 0)
27             {
28             System.out.println(Thread.currentThread().getName()+"sale:"+tick--);
29             }
30             else
31             {
32                 break;
33             }
34 
35         }
36     }
37 }

sleep(long millis)方法抛出异常了    - 以毫秒为单位的休眠时间

具体如下: public static void sleep(long millis)  throws InterrruptedException

所以用的时候要抛出或者try,Runnable由于是接口,故不能抛,只能try。

通过分析:  发现,打印出0,-1,-2等错票。

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

原因: 当多条语句操作线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完。

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

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

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

即:同步代码块。

synchronized(对象)

{

         需要被同步的代码。

同步的前提:

1、必须要有两个或者两个以上的线程

2、必须是多个线程适用同一个锁。

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

好处:解决了多线程的安全问题。   弊端:多个线程都需要判断锁,较为消耗资源。

猜你喜欢

转载自www.cnblogs.com/zxl1010/p/11363806.html