java线程(二)之线程同步

1.在进行多线程操作的时候,两个或则多个线程对同一个数据进行访问或修改,那线程之间会相互影响对数据的获取或修改的

以至于造成数据错误,为了避免多个线程同时对一个数据进行访问,就必须掌握如何对访问进行同步。
2.下面用一个例子来证明多个线程对统一数据进行访问,可能造成错误
    经典例子:有一售票系统,有5个售票点,共有100张名票进行销售,采用多线程来进行问题解决。
 1 /**
 2   * @param args
 3   */
 4  public static void main(String[] args) {
 5 
 6   // 对同一资源让问所以只需要实现一个继承自Runnable的类就可以了
 7   TicketOfficeRunnable target = new TicketOfficeRunnable();
 8   Thread thread1 = new Thread(target);
 9   thread1.setName("售票点一");
10   thread1.start();
11   Thread thread2 = new Thread(target);
12   thread2.setName("售票点二");
13   thread2.start();
14   Thread thread3 = new Thread(target);
15   thread3.setName("售票点三");
16   thread3.start();
17   Thread thread4 = new Thread(target);
18   thread4.setName("售票点四");
19   thread4.start();
20   Thread thread5 = new Thread(target);
21   thread5.setName("售票点五");
22   thread5.start();
23 
24  }
25 
26  public static class TicketOfficeRunnable implements Runnable {
27 
28   private int ticketsNum = 0;
29 
30   @Override
31   public void run() {
32 
33    boolean flag = true;
34    while (flag) {
35     flag = sell();
36    }
37   }
38 
39   public boolean sell() {
40    boolean f = true;
41    if (ticketsNum <= 100) {
42     ticketsNum = ticketsNum + 1;
43     System.out.println(Thread.currentThread().getName() + ":"
44       + "卖出第" + ticketsNum + "张票");
45    } else
46     f = false;
47 
48    try {
49     Thread.sleep(500);
50    } catch (InterruptedException e) {
51     e.printStackTrace();
52    }
53    return f;
54   }
55  }
56 
57 }
运行上面代码结果片段如下,可以观察到售票点三和售票点一同事卖出第36张票,这样结果就是由于多个线程对同一资源访问所引起的。(
具体原因可查看线程同步的一些知识,其实就是CPU分配时间片的问题)
 
 
解决办法就是采用线程同步的方法,每次只有一个线程能访问同一资源。也就是利用synchronized去给某段代码加锁,线程获取到锁后才能对
资源进行访问,没有获取锁的线程则不能。
将上面一段代码改成:
1 synchronized(this){
2    if (ticketsNum <= 100) {
3     ticketsNum = ticketsNum + 1;
4     System.out.println(Thread.currentThread().getName() + ":"
5       + "卖出第" + ticketsNum + "张票");
6    } else
7     f = false;
8    }

就能得到正确答案了

 

 

 

 

 

 

posted @ 2015-06-09 21:19  perfect亮  阅读(184)  评论(0)    收藏  举报