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 }
就能得到正确答案了

浙公网安备 33010602011771号