Java线程同步实例分析
程序员文章站
2024-03-05 18:27:25
本文实例讲述了java线程同步的用法。分享给大家供大家参考。具体分析如下:
多线程的使用为我们的程序提供了众多的方便,同时它也给我们带来了以往没有考虑过的麻烦。当我们使用...
本文实例讲述了java线程同步的用法。分享给大家供大家参考。具体分析如下:
多线程的使用为我们的程序提供了众多的方便,同时它也给我们带来了以往没有考虑过的麻烦。当我们使用多线程处理共享资源时意外将会发生:比如我们一起外出就餐,每个人都是一个线程,餐桌上的食物则是共享资源,当我看到红烧鸡腿上桌后立即拿起筷子直奔目标,眼看着就得手的时候,突然~~~鸡腿消失了,一个距离盘子更近的线程正在得意地啃着。
为了避免上述问题的发生,java为我们提供了“synchronized(同步化)修饰符”来避免资源冲突,你可以将资源类中某个函数或变量声明为synchronized(同步化),每个继承自object的类都含有一个机锁(lock),它是余生俱来的,不需要编写任何代码来启用它。当我们调用任何synchronized(同步化)函数时,该对象将被锁定,对象中所有 synchronized(同步化)函数便无法被调用,直到第一个函数执行完毕并解除机锁。
import java.awt.borderlayout; import java.awt.event.actionevent; import java.awt.event.actionlistener; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtextarea; import javax.swing.jtextfield; /** * 线程同步 * 我们模拟一个银行存储过程来证明线程同步的必要性以及在java中进行线程同步的方法 * 重点:synchronized 修饰符 */ public class testmain5 extends jframe { private myaccounts myaccounts = null; // 我的帐号 private jtextfield text = null; // 银行存款数额显示 private jtextarea textarea = null; // 交易过程显示 private jbutton button = null; // 开始模拟交易的按钮 /** * 构造一个银行存取款界面 */ public testmain5(){ super("线程同步测试"); myaccounts = new myaccounts(); text = new jtextfield(integer.tostring(myaccounts.inquire()), 10); // 我们在银行中的初始存款为100 textarea = new jtextarea(); textarea.settext("交易日志:"); jscrollpane sp = new jscrollpane(textarea); button = new jbutton("开始交易"); button.addactionlistener(new actionlistener(){ public void actionperformed(actionevent e) { new bank("钟楼支行", myaccounts, bank.deal_saving, 800); new bank("高新支行", myaccounts, bank.deal_saving, 1300); new bank("小寨支行", myaccounts, bank.deal_fetch, 200); new bank("雁塔支行", myaccounts, bank.deal_fetch, 400); new bank("兴庆支行", myaccounts, bank.deal_saving, 100); new bank("土门支行", myaccounts, bank.deal_fetch, 700); } }); jpanel pane = new jpanel(); pane.add(text); pane.add(button); this.getcontentpane().add(pane, borderlayout.north); this.getcontentpane().add(sp); this.setdefaultcloseoperation(jframe.exit_on_close); this.setsize(300, 200); this.setlocationrelativeto(null); this.setvisible(true); } /** * 银行交易大厅类 * 一般银行都会有n个交易大厅,这些大厅可以同时处理多笔业务,这正好符合多线程的特点 */ class bank extends thread{ /** * 静态字段:用于表示储存 */ public static final int deal_saving = 0; /** * 静态字段:用于表示提取 */ public static final int deal_fetch = 1; private int buy = bank.deal_fetch; // 默认使取款 private int count = 0; private myaccounts myaccounts = null; // 我的帐号 /** * 构造这个银行交易大厅 * @param name 这个交易大厅的名称 * @param myaccounts 我的银行帐号 * @param buy 行为,参考字段:deal_saving或deal_fetch * @param count 钱的数量 */ public bank(string name, myaccounts myaccounts, int buy, int count){ super(name); this.myaccounts = myaccounts; this.buy = buy; this.count = count; this.start(); } public void run(){ int $count = 0; if(buy == bank.deal_saving){ // 如果是存款业务 $count = myaccounts.saving(count); }else if(buy == bank.deal_fetch){ // 如果是取款业务 $count = myaccounts.fetch(count); } text.settext(integer.tostring($count)); textarea.append("\n" + this.getname() + " " + (buy == bank.deal_saving ? "存款": "取款") + " 金额:" + count + " 结余:" + $count); } } /** * 我的帐号 * 进行同步测试 */ class myaccounts{ private integer count = 1100; public myaccounts(){ } /** * 查询我的帐号 */ public int inquire(){ synchronized (count){ return count; } } /** * 存款业务 * @param c 存款的数量 * @return 业务办理完成后的数量 */ public int saving(int c){ synchronized (count){ //return count += c; // 为了能更好的观察,我们将这个简洁的语句注释掉 int $count = inquire(); // 先查询帐户中的存款 $count += c; try { thread.sleep(1000); // 为了更好的观察,使业务在此停顿1秒钟 } catch (interruptedexception ex) { ex.printstacktrace(); } count = $count; // 最后将总数储存起来 return inquire(); // 返回最新的存款数 } } /** * 取款业务 * @param c 取款的数量 * @return 业务办理完成后的数量 */ public int fetch(int c){ synchronized (count){ //return count -= c; // 为了能更好的观察,我们将这个简洁的语句注释掉 int $count = inquire(); // 先查询帐户中的存款 $count -= c; try { thread.sleep(1000); // 为了更好的观察,使业务在此停顿1秒钟 } catch (interruptedexception ex) { ex.printstacktrace(); } count = $count; // 最后将总数储存起来 return inquire(); // 返回最新的存款数 } } } public static void main(string [] args){ new testmain5(); } }
希望本文所述对大家的java程序设计有所帮助。
上一篇: 菜鸟程序员成长记Java系列(二)