线程安全--- synchronized

package com.Thread;
 
class W12306 implements Runnable{
       private boolean flag = true;
       private int num =10;
       @Override
       public void run() {
             while(flag ) {
                  test6();
            }
      }
      
       //线程不安全,锁定不正确,一般锁定对象
       public void test6() {
             if(num <=0) {
                   flag = false ;
                   return;
            }
             synchronized(this ) {
                   try {
                        Thread. sleep(500);//模拟网络延时,最后取到了0和-1
                  } catch (InterruptedException e) {
                        e.printStackTrace();
                  }
                  System. out.println(Thread.currentThread().getName() + "抢到了" + num--);
            }
 
      }
      
       //线程不安全,锁定资源不正确
       public void test5() {
             synchronized((Integer)num ) {
                   if(num <=0) {
                         flag = false ;
                         return;
                  }
                   try {
                        Thread. sleep(500);//模拟网络延时,最后取到了0和-1
                  } catch (InterruptedException e) {
                        e.printStackTrace();
                  }
                  System. out.println(Thread.currentThread().getName() + "抢到了" + num--);
            }
 
      }
 
      
       //线程不安全,锁定范围过小
       //a b c
       public void test4() {
             synchronized(this ) {
                   //b
                   if(num <=0) {
                         flag = false ;
                         return;
                  }
            }
             //b
             try {
                  Thread. sleep(500);//模拟网络延时,最后取到了0和-1
            } catch (InterruptedException e) {
                  e.printStackTrace();
            }
            System. out.println(Thread.currentThread().getName() + "抢到了" + num --);
             //a-->1
 
      }
 
      
       //线程安全,锁定方法块
       public void test3() {
             synchronized(this ) {
                   if(num <=0) {
                         flag = false ;
                         return;
                  }
                   try {
                        Thread. sleep(500);//模拟网络延时,最后取到了0和-1
                  } catch (InterruptedException e) {
                        e.printStackTrace();
                  }
                  System. out.println(Thread.currentThread().getName() + "抢到了" + num--);
            }
 
      }
 
      
       //线程安全,锁定方法
       public synchronized void test2() {
             if(num <=0) {
                   flag = false ;
                   return;
            }
             try {
                  Thread. sleep(500);//模拟网络延时,最后取到了0和-1
            } catch (InterruptedException e) {
                  e.printStackTrace();
            }
            System. out.println(Thread.currentThread().getName() + "抢到了" + num --);
 
      }
      
       //线程不安全
       public void test1() {
             if(num <0) {
                   flag = false ;
            }
             try {
                  Thread. sleep(500);//最后取到了0和-1
            } catch (InterruptedException e) {
                  e.printStackTrace();
            }
            System. out.println(Thread.currentThread().getName() + "抢到了" + num --);
 
      }
}
public class Synchronized_ {
       public static void main(String[] args) {
            W12306 w = new W12306();
            
            Thread t1 = new Thread(w, "甲" );
            Thread t2 = new Thread(w, "已" );
            Thread t3 = new Thread(w, "丁" );
            
            t2.start();
            t1.start();
            t3.start();
      }
}
posted @ 2015-04-03 12:49  王八一瓶子  阅读(192)  评论(0)    收藏  举报