package com.knowledge.Test;
/**
* 继承Thread类
* @author job
*
*/
public class syn_gou extends Thread{
//余额
int yu;
//总金额
int count = 1000;
//每次索取金额
int getmoney = 200;
//run方法是Thread类的线程执行体
public void run(){
//实现同步(没有同步则每次线程取钱混乱)
synchronized(this){
//如果总金额大于等于所取金额向下执行
if(count >= getmoney){
//计算余额
yu = count - getmoney;
//改变取完后的金额
count = yu;
System.out.println(Thread.currentThread().getName()+"取钱余额:"+getmoney+"余额为:"+yu);
}else{
System.out.println("余额不足!");
}
}
}
}
package com.knowledge.Test;
/**
* 测试类
* @author job
*
*/
public class syn_test {
public static void main(String[] args){
//syn_gou类的实例
syn_gou s = new syn_gou();
//创建6条线程
Thread t = new Thread(s);
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
Thread t3 = new Thread(s);
Thread t4 = new Thread(s);
Thread t5 = new Thread(s);
//启动线程
t. start();
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
//启动的这6个线程具体先执行那个是系统内部来控制,在程序中我们不能控制
//具体那个先执行是看那个先抢占到cpu,先抢到的先执行。所以会出现测试结果中的
/*
Thread-1
Thread-3
Thread-2
Thread-5
Thread-4
也可以理解为随机的
*/
}
}
测试结果:
Thread-1取钱余额:200余额为:800
Thread-3取钱余额:200余额为:600
Thread-2取钱余额:200余额为:400
Thread-5取钱余额:200余额为:200
Thread-4取钱余额:200余额为:0
余额不足!
如果没有synchronized实现同步:
(有很多种不正确的结果这里只列出3种做参考)
Thread-1取钱余额:200余额为:800
Thread-3取钱余额:200余额为:600
Thread-5取钱余额:200余额为:400
Thread-2取钱余额:200余额为:200
Thread-6取钱余额:200余额为:0
Thread-4取钱余额:200余额为:-200
Thread-1取钱余额:200余额为:800
Thread-3取钱余额:200余额为:400
Thread-2取钱余额:200余额为:400
Thread-6取钱余额:200余额为:200
Thread-4取钱余额:200余额为:0
余额不足!
Thread-2取钱余额:200余额为:600
Thread-1取钱余额:200余额为:600
Thread-3取钱余额:200余额为:400
Thread-4取钱余额:200余额为:200
Thread-5取钱余额:200余额为:0
余额不足!
本文探讨了使用Java并发编程实现线程同步的过程,通过创建并启动多个线程,演示了如何利用`synchronized`关键字确保资源访问的正确性和一致性。展示了在没有同步的情况下可能出现的数据混乱,并对比了同步实现前后输出结果的差异。
1168

被折叠的 条评论
为什么被折叠?



