java 线程之对象的同步和异步(实例讲解)

 更新时间:2017年07月20日 08:19:58   投稿:jingxian  
下面小编就为大家带来一篇java 线程之对象的同步和异步(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一、多线程环境下的同步与异步

同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求不到,怎么办,A线程只能等待下去。

package com.jalja.org.thread.demo01;

public class Thread02 {
 public synchronized void method1(){
  System.out.println("method1:"+Thread.currentThread().getName());
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
 public synchronized void method2(){
  System.out.println("method2:"+Thread.currentThread().getName());
 }
 public static void main(String[] args) {
  final Thread02 th=new Thread02();
  Thread thread1=new Thread(new Runnable() {
   public void run() {
    th.method1();
   }
  },"th1");
  
  Thread thread2=new Thread(new Runnable() {
   public void run() {
    th.method2();
   }
  },"th2");
  
  thread1.start();
  thread2.start();
 }
}

观察输出结果:method1:th1 在3秒后 method2:th2 输出,这是因为method2() 与 method1()都是同步方法,而线程thread1 与 thread2操作的是同一个对象th,所以thread2在执行method2()方法时,需要先获得到th对象的锁。

异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程仍然请求的到,A线程无需等待。

package com.jalja.org.thread.demo01;

public class Thread02 {
 public synchronized void method1(){
  System.out.println("method1:"+Thread.currentThread().getName());
  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
 public void method2(){
  System.out.println("method2:"+Thread.currentThread().getName());
 }
 public static void main(String[] args) {
  final Thread02 th=new Thread02();
  Thread thread1=new Thread(new Runnable() {
   public void run() {
    th.method1();
   }
  },"th1");
  
  Thread thread2=new Thread(new Runnable() {
   public void run() {
    th.method2();
   }
  },"th2");
  
  thread1.start();
  thread2.start();
 }
}

观察输出结果:method1:th1 与 method2:th2 同时输出,这是因为method2 没有加同步控制,所以线程thread2在执行method2()方法时不用去获得执行权限(对象锁)。

二、数据的脏读

我们在设计业务的时候一定要考虑业务的整体性,不然就会出现数据一致性问题。

package com.jalja.org.thread.demo01;

public class Thread03 {
 private String name="zs";
 private String passWorrd="123";
 public synchronized void setValue(String name,String passWord){
  this.name=name;
  try {
   Thread.sleep(2000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  this.passWorrd=passWord;
  System.out.println("set:name="+this.name +" passWorrd="+this.passWorrd);
 }
 public void getValue(){
  System.out.println("get:name="+this.name +" passWorrd="+this.passWorrd);
 }
 public static void main(String[] args) throws InterruptedException {
  final Thread03 th=new Thread03();
  Thread thread=new Thread(new Runnable() {
   public void run() {
    th.setValue("LS", "456");
   }
  });
  thread.start();
  Thread.sleep(100);
  th.getValue();
 }
}

结果:get:name=LS  passWorrd=123     set:name=LS  passWorrd=456    由结果可知get的数据显然有问题,这是因为thread线程在set的时候,main线程在执行get方法。想要避免这种情况,我们就要保证当有线程在操作同一个对象的数据时,就不然其他线程也同时操作该对象的数据。这个情况我们在get方法上加 synchronized 关键字即可。

以上这篇java 线程之对象的同步和异步(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用poi操作excel实例解析

    Java使用poi操作excel实例解析

    这篇文章主要为大家详细介绍了Java使用poi操作excel的简单实例,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • java调用短信猫发短信示例

    java调用短信猫发短信示例

    这篇文章主要介绍了java调用短信猫发短信示例,需要的朋友可以参考下
    2014-04-04
  • Hibernate中load方法与get方法的区别

    Hibernate中load方法与get方法的区别

    Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的
    2016-01-01
  • JVM双亲委派模型知识详细总结

    JVM双亲委派模型知识详细总结

    今天带各位小伙伴学习Java虚拟机的相关知识,文中对JVM双亲委派模型作了非常详细的介绍,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • java实现从网上下载图片到本地的方法

    java实现从网上下载图片到本地的方法

    这篇文章主要介绍了java实现从网上下载图片到本地的方法,涉及java针对文件操作的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • 误将.idea文件提交至git后删除的操作方法

    误将.idea文件提交至git后删除的操作方法

    这篇文章主要介绍了误将.idea文件提交至git后删除的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 一篇文章搞定Struts2的类型转换

    一篇文章搞定Struts2的类型转换

    这篇文章主要介绍了关于Struts2类型转换的相关资料,文中主要介绍了Struts2的类型转换器和自定义类型转换器的实现,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • Java异常处理实例分析

    Java异常处理实例分析

    这篇文章主要介绍了Java异常处理,实例分析了java异常处理的常见用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 基于java中子类的继承性的应用介绍

    基于java中子类的继承性的应用介绍

    本篇介绍了,基于java中子类的继承性的应用。需要的朋友参考下
    2013-05-05
  • Java单例模式简单示例

    Java单例模式简单示例

    这篇文章主要介绍了Java单例模式,结合实例形式简单分析了java单例模式的定义与使用技巧,需要的朋友可以参考下
    2017-06-06

最新评论