当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:12:00  来源:本站整理

<b>Java线程:线程的同步-同步块</b>[Java编程]

赞助商链接



  本文“<b>Java线程:线程的同步-同步块</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

追其同步的根本的目的,是掌握竞争资源的精确的拜候,因此只要在拜候竞争资源的时刻保证同一时刻只能一个线程拜候便可,因此Java引入了同步代码快的战略,以提高性能.

在上个例子的底子上,对oper办法做了窜改,由同步办法改成同步代码块情势,程序的履行逻辑并没有问题.

/**
* Java线程:线程的同步-同步代码块
*
* @author leizhimin 
*/
public class Test {
         public static void main(String[] args) {
                 User u = new User("张三", 100);
                 MyThread t1 = new MyThread("线程A", u, 20);
                 MyThread t2 = new MyThread("线程B", u, -60);
                 MyThread t3 = new MyThread("线程C", u, -80);
                 MyThread t4 = new MyThread("线程D", u, -30);
                 MyThread t5 = new MyThread("线程E", u, 32);
                 MyThread t6 = new MyThread("线程F", u, 21);
                 t1.start();
                 t2.start();
                 t3.start();
                 t4.start();
                 t5.start();
                 t6.start();
         }
}
class MyThread extends Thread {
         private User u;
         private int y = 0;
         MyThread(String name, User u, int y) {
                 super(name);
                 this.u = u;
                 this.y = y;
         }
         public void run() {
                 u.oper(y);
         }
}
class User {
         private String code;
         private int cash;
         User(String code, int cash) {
                 this.code = code;
                 this.cash = cash;
         }
         public String getCode() {
                 return code;
         }
         public void setCode(String code) {
                 this.code = code;
         }
         /**
          * 业务办法 
          *
          * @param x 增添x万元
          */
         public void oper(int x) {
                 try {
                         Thread.sleep(10L);
                         synchronized (this) {
                                 this.cash += x;
                                 System.out.println(Thread.currentThread().getName() + "运行完毕,增添“" + x + "”,当前用户账户余额为:" + cash);
                         }
                         Thread.sleep(10L);
                 } catch (InterruptedException e) {
                         e.printStackTrace();
                 }
         }
         @Override 
         public String toString() {
                 return "User{" +
                                 "code='" + code + '\'' +
                                 ", cash=" + cash +
                                 '}';
         }
}

线程E运行完毕,增添“32”,当前用户账户余额为:132
线程B运行完毕,增添“-60”,当前用户账户余额为:72
线程D运行完毕,增添“-30”,当前用户账户余额为:42
线程F运行完毕,增添“21”,当前用户账户余额为:63
线程C运行完毕,增添“-80”,当前用户账户余额为:-17
线程A运行完毕,增添“20”,当前用户账户余额为:3
Process finished with exit code 0

注意:

在利用synchronized关键字时刻,应当尽大概避免在synchronized办法或synchronized块中利用sleep大概 yield办法,因为synchronized程序块占据着对象锁,你歇息那么其他的线程只能一边等着你醒来履行完了才能履行.不但严重影响效率,也不合逻辑.

一样,在同步程序块内调用yeild办法让出CPU资源也没有意义,因为你占用着锁,其他互斥线程还是无法拜候同步程序块.当然与同步程序块无关的线程可以得到更多的履行时间.

出处:http://lavasoft.blog.51cto.com/62575/221922


  以上是“<b>Java线程:线程的同步-同步块</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .