• Java多线程之~~~~synchronized 方法


    在多线程开发中,总会遇到多个在不同线程中的方法操作同一个数据,这样在不同线程中操作这个数据不同的顺序

    或者时机会导致各种不同的现象发生,以至于不能实现你预期的效果,不能实现一致性,这时候就能够使用

    synchronizedkeyword对一个方法来说,这个synchronized能保证全部调用这种方法的线程仅仅有一个正在操作这种方法。

    不会出现同一时候多个线程进入这种方法的情况,以下我们来一个样例说明这个情况。


    首先是一个Account类,这个类模拟账户,提供添加工资和降低工资的方法,当然。这种方法是被synchronized控制

    package com.bird.concursey.charpet2;
    
    public class Account {
    	
    	private double balance;
    
    	public double getBalance() {
    		return balance;
    	}
    
    	public void setBalance(double balance) {
    		this.balance = balance;
    	}
    
    	public synchronized void addAmount(double amount) {
    		double temp = balance;
    		try {
    			Thread.sleep(10);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		temp += amount;
    		balance = temp;
    	}
    	
    	public synchronized void subtractAmount(double amount) {
    		double temp = balance;
    		try {
    			Thread.sleep(10);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		temp -= amount;
    		balance = temp;
    	}
    }
    

    和保护的。



    然后是两个模拟类,来模拟使用这个类来添加或者降低账户的剩余金额


    package com.bird.concursey.charpet2;
    
    public class Bank implements Runnable {
    	
    	private Account account;
    	
    	public Bank(Account account) {
    		this.account = account;
    	}
    
    	@Override
    	public void run() {
    		for(int i = 0; i < 100; i++) {
    			account.subtractAmount(1000);
    		}
    	}
    
    }
    



    package com.bird.concursey.charpet2;
    
    public class Company implements Runnable {
    	
    	private Account account;
    	
    	public Company(Account account) {
    		this.account = account;
    	}
    
    	@Override
    	public void run() {
    		for(int i = 0; i < 100; i++) {
    			account.addAmount(1000);
    		}
    	}
    	
    	
    	public static void main(String[] args) {
    		Account account = new Account();
    		account.setBalance(1000);
    		
    		Company company = new Company(account);
    		Thread companyThread = new Thread(company);
    		
    		Bank bank = new Bank(account);
    		Thread bankThread = new Thread(bank);
    		
    		System.out.printf("Account : Initial Balance: %f
    ",account.getBalance());
    		
    		companyThread.start();
    		bankThread.start();
    		
    		
    		try {
    			companyThread.join();
    			bankThread.join();
    			System.out.printf("Account : Final Balance: %f
    ",account.getBalance());
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    这样不管怎么使用都能得到正确的结果


  • 相关阅读:
    根据View找控制器
    ScrollView双击图片定点放大
    iOS消息推送原理和实现总结
    iOS完整学习路线图
    获取设备版本
    UIView与CALayer的区别,很详细
    iOS开发网络数据之AFNetworking使用
    (已实践)PLSQL本地还原Oracle数据库dmp文件
    所遇Oracle错误代码
    Dapper基本使用
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6829839.html
Copyright © 2020-2023  润新知