• 线程之间共享数据(两个线程之间使用同一份数据),线程锁要统一,不统一的话会出现线程安全问题


    1.任意对象锁

    public class ThisLockDemo2 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Ticket5 ticket = new Ticket5();
    		Thread t = new Thread(ticket);
    		t.start();
    		try {Thread.sleep(100);} catch (Exception e) {}
    		ticket.flag = false;
    		Thread t2 = new Thread(ticket);
    		t2.start();
    
    	}
    
    }
    
    class Ticket5 implements Runnable {
    	private int tickets = 100;
    	Object obj = new Object();
    	boolean flag = true;
    
    	@Override
    	// public synchronized void run() {
    	public void run() {
    		if (flag) {
    			while (true) {
    				synchronized (obj) { //任意对象锁
    					if (tickets > 0) {
    						try {
    							Thread.sleep(10);
    						} catch (Exception e) {
    						}
    						System.out.println(Thread.currentThread().getName()+"-----"+tickets--);
    					}
    				}
    			}
    		}else{
    			while(true){
    				show();
    			}
    		}
    	}
    
    	public synchronized void show() {
    		if (tickets > 0) {
    			try {Thread.sleep(10);} catch (Exception e) {}
    			System.out.println(Thread.currentThread().getName()+"+++++"+tickets--);
    		}
    	}
    }
    

      输出结果:

          

    Thread-0-----100
    Thread-0-----99
    Thread-0-----98
    Thread-0-----97
    Thread-0-----96
    Thread-0-----95
    Thread-0-----94
    Thread-0-----93
    Thread-0-----92
    Thread-0-----91
    Thread-0-----90
    Thread-1+++++89
    Thread-0-----87
    Thread-1+++++88
    Thread-1+++++86
    Thread-0-----85
    Thread-1+++++84
    Thread-0-----83
    Thread-1+++++82
    Thread-0-----81
    Thread-1+++++80
    Thread-0-----79
    Thread-1+++++78
    Thread-0-----77
    Thread-0-----76
    Thread-1+++++76
    Thread-1+++++75
    Thread-0-----74
    Thread-0-----73
    Thread-1+++++72
    Thread-0-----71
    Thread-1+++++70
    Thread-1+++++69
    Thread-0-----68
    Thread-1+++++67
    Thread-0-----66
    Thread-1+++++65
    Thread-0-----64
    Thread-1+++++63
    Thread-0-----62
    Thread-0-----61
    Thread-1+++++60
    Thread-1+++++59
    Thread-0-----58
    Thread-1+++++57
    Thread-0-----56
    Thread-1+++++55
    Thread-0-----54
    Thread-1+++++53
    Thread-0-----52
    Thread-0-----51
    Thread-1+++++50
    Thread-1+++++49
    Thread-0-----48
    Thread-1+++++47
    Thread-0-----46
    Thread-0-----45
    Thread-1+++++44
    Thread-1+++++43
    Thread-0-----42
    Thread-0-----41
    Thread-1+++++40
    Thread-0-----38
    Thread-1+++++39
    Thread-1+++++37
    Thread-0-----36
    Thread-0-----35
    Thread-1+++++34
    Thread-1+++++33
    Thread-0-----32
    Thread-0-----31
    Thread-1+++++30
    Thread-1+++++29
    Thread-0-----28
    Thread-1+++++27
    Thread-0-----26
    Thread-1+++++25
    Thread-0-----24
    Thread-1+++++23
    Thread-0-----22
    Thread-1+++++21
    Thread-0-----20
    Thread-1+++++19
    Thread-0-----18
    Thread-1+++++17
    Thread-0-----16
    Thread-1+++++15
    Thread-0-----14
    Thread-1+++++13
    Thread-0-----12
    Thread-1+++++11
    Thread-0-----10
    Thread-1+++++9
    Thread-0-----8
    Thread-1+++++7
    Thread-0-----6
    Thread-1+++++5
    Thread-0-----4
    Thread-1+++++3
    Thread-0-----2
    Thread-0-----1
    Thread-1+++++0
    

      2.同一对象锁:不存在线程安全问题

        

    package day11;
    
    public class ThisLockDemo2 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Ticket5 ticket = new Ticket5();
    		Thread t = new Thread(ticket);
    		t.start();
    		try {Thread.sleep(100);} catch (Exception e) {}
    		ticket.flag = false;
    		Thread t2 = new Thread(ticket);
    		t2.start();
    
    	}
    
    }
    
    class Ticket5 implements Runnable {
    	private int tickets = 100;
    	Object obj = new Object();
    	boolean flag = true;
    
    	@Override
    	// public synchronized void run() {
    	public void run() {
    		if (flag) {
    			while (true) {
    				synchronized (this) { 
    					if (tickets > 0) {
    						try {
    							Thread.sleep(10);
    						} catch (Exception e) {
    						}
    						System.out.println(Thread.currentThread().getName()+"-----"+tickets--);
    					}
    				}
    			}
    		}else{
    			while(true){
    				show();
    			}
    		}
    	}
    
    	public synchronized void show() {  //此方法的对象锁是 this
    		if (tickets > 0) {
    			try {Thread.sleep(10);} catch (Exception e) {}
    			System.out.println(Thread.currentThread().getName()+"+++++"+tickets--);
    		}
    	}
    }
    

      输出结果:

    Thread-0-----100
    Thread-0-----99
    Thread-0-----98
    Thread-0-----97
    Thread-0-----96
    Thread-0-----95
    Thread-0-----94
    Thread-0-----93
    Thread-0-----92
    Thread-0-----91
    Thread-0-----90
    Thread-0-----89
    Thread-0-----88
    Thread-0-----87
    Thread-0-----86
    Thread-0-----85
    Thread-0-----84
    Thread-0-----83
    Thread-0-----82
    Thread-0-----81
    Thread-0-----80
    Thread-0-----79
    Thread-0-----78
    Thread-0-----77
    Thread-0-----76
    Thread-0-----75
    Thread-0-----74
    Thread-0-----73
    Thread-0-----72
    Thread-0-----71
    Thread-0-----70
    Thread-0-----69
    Thread-0-----68
    Thread-0-----67
    Thread-0-----66
    Thread-1+++++65
    Thread-1+++++64
    Thread-1+++++63
    Thread-1+++++62
    Thread-1+++++61
    Thread-1+++++60
    Thread-1+++++59
    Thread-1+++++58
    Thread-1+++++57
    Thread-1+++++56
    Thread-1+++++55
    Thread-1+++++54
    Thread-1+++++53
    Thread-1+++++52
    Thread-1+++++51
    Thread-1+++++50
    Thread-1+++++49
    Thread-1+++++48
    Thread-1+++++47
    Thread-1+++++46
    Thread-1+++++45
    Thread-1+++++44
    Thread-1+++++43
    Thread-1+++++42
    Thread-1+++++41
    Thread-1+++++40
    Thread-1+++++39
    Thread-1+++++38
    Thread-1+++++37
    Thread-1+++++36
    Thread-1+++++35
    Thread-1+++++34
    Thread-1+++++33
    Thread-1+++++32
    Thread-1+++++31
    Thread-1+++++30
    Thread-1+++++29
    Thread-1+++++28
    Thread-1+++++27
    Thread-1+++++26
    Thread-1+++++25
    Thread-1+++++24
    Thread-1+++++23
    Thread-1+++++22
    Thread-1+++++21
    Thread-1+++++20
    Thread-1+++++19
    Thread-1+++++18
    Thread-1+++++17
    Thread-1+++++16
    Thread-1+++++15
    Thread-1+++++14
    Thread-1+++++13
    Thread-1+++++12
    Thread-1+++++11
    Thread-1+++++10
    Thread-1+++++9
    Thread-1+++++8
    Thread-1+++++7
    Thread-1+++++6
    Thread-1+++++5
    Thread-1+++++4
    Thread-1+++++3
    Thread-1+++++2
    Thread-1+++++1
    

      

  • 相关阅读:
    24张图,九大数据结构安排得明明白白
    mysql中的mvcc解读
    常见电商项目的数据库表设计(MySQL版)
    两万字深度介绍分布式系统原理,一文入魂
    使用消息中间件时,如何保证消息仅仅被消费一次?
    GCC/G++选项 -Wl,-Bstatic和-Wl,-Bdynamic
    sql 练习
    设计模式-单例模式
    设计模式-抽象工厂模式
    设计模式-工厂方法模式
  • 原文地址:https://www.cnblogs.com/childhooding/p/4644643.html
Copyright © 2020-2023  润新知