• 线程安全--- 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();
          }
    }
  • 相关阅读:
    事务
    排序算法
    二维数组中的查找
    在Linux中安装Matlab
    null和“”的区别
    【学习笔记】〖九度OJ〗题目1433:FatMouse
    【学习笔记】〖九度OJ〗题目1464:Hello World for U
    year:2017 month:8 day:1
    year:2017 month:07 day:31
    year:2017 month:7 day:27
  • 原文地址:https://www.cnblogs.com/king-/p/4389738.html
Copyright © 2020-2023  润新知