全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java线程同步、同步方法实例详解

线程的同步是保证多线程安全访问竞争资源的一种手段。

线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题?

对于同步,在具体的Java代码中需要完成一下两个操作:

把竞争访问的资源标识为private;

同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。

当然这不是唯一控制并发安全的途径。

 synchronized关键字使用说明

synchronized只能标记非抽象的方法,不能标识成员变量。 

为了演示同步方法的使用,构建了一个信用卡账户,起初信用额为100w,然后模拟透支、存款等多个操作。显然银行账户User对象是个竞争资源,而多个并发操作的是账户方法oper(int x),当然应该在此方法上加上同步,并将账户的余额设为私有变量,

禁止直接访问。

/** 
* Java线程:线程的同步 
* 
* @author leizhimin 2009-11-4 11:23:32 
*/ 
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 synchronized void oper(int x) { 
    try { 
      Thread.sleep(10L); 
      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 + 
        '}'; 
  } 
} 

输出结果:

线程A运行结束,增加“20”,当前用户账户余额为:120 
线程F运行结束,增加“21”,当前用户账户余额为:141 
线程E运行结束,增加“32”,当前用户账户余额为:173 
线程C运行结束,增加“-80”,当前用户账户余额为:93 
线程B运行结束,增加“-60”,当前用户账户余额为:33 
线程D运行结束,增加“-30”,当前用户账户余额为:3 

反面教材,不同步的情况,也就是去掉oper(int x)方法的synchronized修饰符,然后运行程序,结果如下:

线程A运行结束,增加“20”,当前用户账户余额为:61 
线程D运行结束,增加“-30”,当前用户账户余额为:63 
线程B运行结束,增加“-60”,当前用户账户余额为:3 
线程F运行结束,增加“21”,当前用户账户余额为:61 
线程E运行结束,增加“32”,当前用户账户余额为:93 
线程C运行结束,增加“-80”,当前用户账户余额为:61 

很显然,上面的结果是错误的,导致错误的原因是多个线程并发访问了竞争资源u,并对u的属性做了改动。

可见同步的重要性。 

注意:

通过前文可知,线程退出同步方法时将释放掉方法所属对象的锁,但还应该注意的是,同步方法中还可以使用特定的方法对线程进行调度。这些方法来自于java.lang.Object类。

void notify()  
     唤醒在此对象监视器上等待的单个线程。  
void notifyAll()  
     唤醒在此对象监视器上等待的所有线程。  
void wait()  
     导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。  
void wait(long timeout)  
     导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。  
void wait(long timeout, int nanos)  
     导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量 

结合以上方法,处理多线程同步与互斥问题非常重要,著名的生产者-消费者例子就是一个经典的例子,任何语言多线程必学的例子。 

希望本篇文章对小伙伴们有所帮助


# java  # 线程同步方法  # java线程同步  # java中synchronized(同步代码块和同步方法)详解及区别  # java 中同步方法和同步代码块的区别详解  # Java同步代码块解决银行取钱的安全问题实例分析  # Java使用同步方法解决银行取钱的安全问题案例分析  # Java线程同步方法实例总结  # java多线程的同步方法实例代码  # 详解Java多线程编程中的线程同步方法  # java多线程编程之Synchronized块同步方法  # java多线程编程之使用Synchronized块同步方法  # Java同步代码块和同步方法原理与应用案例详解  # 余额为  # 多个  # 在此  # 多线程  # 的是  # 器上  # 是个  # 万元  # 还可以  # 什么时候  # 设为  # 不清楚  # 并将  # 并对  # 来自于  # 非常重要  # 或者其他  # 时将  # 问题需要  # 但还 


相关文章: 如何高效利用亚马逊云主机搭建企业网站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  微信h5制作网站有哪些,免费微信H5页面制作工具?  SQL查询语句优化的实用方法总结  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  代购小票制作网站有哪些,购物小票的简要说明?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  视频网站制作教程,怎么样制作优酷网的小视频?  建站主机CVM配置优化、SEO策略与性能提升指南  Swift中switch语句区间和元组模式匹配  如何用已有域名快速搭建网站?  c++ stringstream用法详解_c++字符串与数字转换利器  如何挑选优质建站一级代理提升网站排名?  如何通过VPS搭建网站快速盈利?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  定制建站流程解析:需求评估与SEO优化功能开发指南  内网网站制作软件,内网的网站如何发布到外网?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  怀化网站制作公司,怀化新生儿上户网上办理流程?  建站主机选购指南:核心配置与性价比推荐解析  高性能网站服务器部署指南:稳定运行与安全配置优化方案  C#怎么使用委托和事件 C# delegate与event编程方法  黑客如何通过漏洞一步步攻陷网站服务器?  如何在万网开始建站?分步指南解析  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何在七牛云存储上搭建网站并设置自定义域名?  香港服务器部署网站为何提示未备案?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  购物网站制作公司有哪些,哪个购物网站比较好?  高端云建站费用究竟需要多少预算?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  建站之星如何助力企业快速打造五合一网站?  如何选择适合PHP云建站的开源框架?  实现虚拟支付需哪些建站技术支撑?  建站之星后台管理如何实现高效配置?  PHP 500报错的快速解决方法  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  淘宝制作网站有哪些,淘宝网官网主页?  网站制作公司排行榜,抖音怎样做个人官方网站  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  网站专业制作公司有哪些,做一个公司网站要多少钱? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。