线程和进程的区别:
线程:是进程内部中的单一顺序控制流,一个进程拥有多个线程,多个线程共享一个进程的内存空间。
进程:是指一种“自包容”的运行程序,由操作系统直接管理。直接运行。有直接的地址空间,每个进程以开始都会消化内存。
线程同步:当二个或二个以上的进程同时访问一个资源时,为了保护资源的数据安全,只允许同一时间一个进程的访问,别的进程需要等待该进程放弃这个资源使用权时才能继续访问。
用一个列子来说明线程同步到底是怎么回事。
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属性值是前一个进程访问后修改的值,如果大于了这个值那么就取不出来。
原文地址:https://www.cnblogs.com/dmp90/p/9042993.html
时间: 2024-10-27 18:36:21