- class SellTicket
- {
- public static void main(String[] args)
- {
- Ticket t1 = new Ticket();
- Ticket t2 = new Ticket();
- Ticket t3 = new Ticket();
- Ticket t4 = new Ticket();
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- }
- }
- class Ticket extends Thread
- {
- Object obj = new Object();
- private static int tick = 100;
- public void run() // Thread-0..sale 0 Thread-1..sale -1 Thread-2..sale -2
- {
- while(true)
- {
- synchronized(obj) // Thread-0..sale 0 Thread-1..sale -1 Thread-2..sale -2
- {
- if (tick>0)
- {
- try{Thread.sleep(500);}catch(Exception e){}
- System.out.println(currentThread().getName()+"..sale "+tick--);
- }
- }
- }
- }
- }
- /*
- Thread-0..sale 0
- Thread-1..sale -1
- Thread-2..sale -2
- */
复制代码 关于Runnable接口进行的多线程产生的安全问题,及解决方案,这里不赘述。视频上面已经讲的很完整。但是对于extends Thread 的多线程安全问题,视频上面没有涉及,实际开发中,可能也不会用到。但是,作为一个小知识,可以了解一下。
这段代码运行到最后,必然出现Thread-0..sale 0 Thread-1..sale -1 Thread-2..sale -2。无论是使用public synchronized void run() {.....} ,还是在public void run() {..synchronized(obj)...}中使用。都不能解决这种安全问题。
解决方法就是,还是使用同步代码块,但是,在Object对象前面加上static 。-----说明,对于静态成员变量作为共享数据时,对象锁也必须是静态的。
|
|