zoukankan      html  css  js  c++  java
  • 线程安全--- 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();
          }
    }
  • 相关阅读:
    vijos p1782——借教室(noip2012提高组第2题)
    vijos p1781——同余方程(noip2012提高组第1题)
    vijos p1905——生活大爆炸版 石头剪刀布(noip2014提高组第一题)
    URAL_1018 二叉苹果树
    b_lc_统计同构子字符串的数目(找规律 / dp)
    a_lc_完成所有工作的最短时间(暴搜 / 状压)
    lc_b_栈和队列设计(都需要不断踢出非法元素的过程)
    a_lc_缺失的第一个整数 I~II(暴力 / 不断放到正确位置)
    b_lc_最短无序连续子数组(暴力 / )
    b_lc_把二叉搜索树转换为累加树(逆中序遍历 / 迭代)
  • 原文地址:https://www.cnblogs.com/king-/p/4389738.html
Copyright © 2011-2022 走看看