- /*
- 多线程的安全问题。
- 安全问题产生的原因:
- 1,多个线程在操作共享数据。
- 2,操作共享数据的代码有多条。
- 一个线程在执行多条操作共享数据的过程中,其他线程参数与了运算,这时就会发生安全问题。
- 想要分析是否安全问题:
- 依据:线程任务中有没有共享数据,该数据是否被多条语句操作啊。
- 解决方案:只要保证一个线程在执行多条操作共享数据的语句时,其他线程不能参与运算即可。
- 当该线程都执行完后,其他线程才可以执行这些语句。
- 代码表现:java中给我们提供具体的解决语句。
- 那就是同步代码块。
- 格式:
- synchronized(对象)//对象可以是任意的对象。
- {
- 需要被同步的语句。
- }
- 同步的原理:其实就是将需要同步的代码进行封装,并在该代码上加了一个锁。
- 同步的好处:解决多线程的安全问题。
- 同步的弊端:会降低性能。
- 一种现象:出现了多线程安全问题,为了解决,加上同步,发现,问题依旧。
- 怎么办?
- 同步的前提:
- 必须要保证在同步中有多个线程。因为同步中只有一个线程该同步是没有意义。
- 必须要保证多个线程在同步中使用的是同一个锁。
- 必须保证多个线程使用的锁是同一个。
- 这时才成为多个线程被同步了。
- */
- class Ticket implements Runnable
- {
- private int num = 200;
- Object obj = new Object();
- public void run()
- {
- while(true)
- {
- synchronized(obj)
- {
- if(num>0)
- {
- try{Thread.sleep(10);}catch(InterruptedException e){}
- System.out.println(Thread.currentThread().getName()+".....sale....."+num--);
- }
- }
- }
- }
- }
- class ThreadSynDemo
- {
- public static void main(String[] args)
- {
- Ticket t = new Ticket();
-
- //创建线程对象。
-
- Thread t1 = new Thread(t);
- Thread t2 = new Thread(t);
- Thread t3 = new Thread(t);
- Thread t4 = new Thread(t);
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- }
- }
复制代码 |