码迷,mamicode.com
首页 > 编程语言 > 详细

线程同步关键字synchronized的作用

时间:2018-05-15 22:49:48      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:ane   generate   允许   public   style   package   进程   vax   exce   

线程和进程的区别:

 线程:是进程内部中的单一顺序控制流,一个进程拥有多个线程,多个线程共享一个进程的内存空间。 

 进程:是指一种“自包容”的运行程序,由操作系统直接管理。直接运行。有直接的地址空间,每个进程以开始都会消化内存。

线程同步:当二个或二个以上的进程同时访问一个资源时,为了保护资源的数据安全,只允许同一时间一个进程的访问,别的进程需要等待该进程放弃这个资源使用权时才能继续访问。

用一个列子来说明线程同步到底是怎么回事。

package com.project.thread;
import java.util.Vector;
import javax.swing.JOptionPane;
public class Bank {
    private int money=2000;
    public  void getMoney(int m){
        if(this.money<m){
            System.out.println("余额超支");
            return;
        }
       try {
        Thread.sleep(1000);
        this.money-=m;
        System.out.println("取走"+m+"余额"+this.money);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
    public static void main(String[] args) {
        Bank b=new Bank();
        Uesr u1=new  Uesr(b,1500);
        Uesr u2=new  Uesr(b,1600);
    }
}
class Uesr extends Thread {
    private Bank bank;
    private int money;
    public Uesr(Bank bank, int money) {        
        this.bank = bank;
        this.money = money;
        this.start();
    }
    public void run(){
        bank.getMoney(money);
}
}

上面代码运行时会出现以下的结果:

取走1500余额-1100
取走1600余额-1100

这是因为第一个线程在进行休眠的时候,第二个线程会访问这个资源(bank),因此只要你每次取钱不超过2000,不管余额是多少都能取出来。

而在getMoney()加上关键字synchronized会怎样?,其他地方的代码都是一样。

 //synchronized 线程同步安全关键字
    public void getMoney(int m){
        if(this.money<m){
            System.out.println("余额超支");
            return;
        }

运行结果是:

取走1500余额500
余额超支

从结果可以看出来关键字 synchronized的作用是:只允许同一时间一个进程的访问,别的进程需要等待该进程放弃这个资源使用权时才能继续访问。下个进程访问时候,money属性值是前一个进程访问后修改的值,如果大于了这个值那么就取不出来。

线程同步关键字synchronized的作用

标签:ane   generate   允许   public   style   package   进程   vax   exce   

原文地址:https://www.cnblogs.com/dmp90/p/9042993.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!