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排序算法实例

    十种JAVA排序算法实例

    本文件讲了十种JAVA排序方法(冒泡(Bubble)排序——相邻交换 、选择排序——每次最小/大排在相应的位置 、插入排序——将下一个插入已排好的序列中 、壳(Shell)排序——缩小增量 、归并排序 、快速排序 、堆排序 、拓扑排序 、锦标赛排序 、基数排序)的使用,并提供了实例代码可参考
    2013-11-11
  • Java如何在PPT中绘制图形

    Java如何在PPT中绘制图形

    这篇文章主要介绍了Java如何在PPT中绘制图形,Microsoft PowerPoint可支持在幻灯片中插入各种类型的图形并且可设置图形填充、线条颜色、图形大小、位置等。下面将通过Java编程来演示在PPT中绘制图形的方法,需要的朋友可以参考下
    2019-07-07
  • Spring Data JPA中 in 条件参数的传递方式

    Spring Data JPA中 in 条件参数的传递方式

    这篇文章主要介绍了Spring Data JPA中 in 条件参数的传递方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • jdk中密钥和证书管理工具keytool常用命令详解

    jdk中密钥和证书管理工具keytool常用命令详解

    keytool JAVA是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务
    2014-01-01
  • Java实现SHA1加密代码实例

    Java实现SHA1加密代码实例

    这篇文章给大家分享了Java实现SHA1加密的相关实例代码,有兴趣的朋友可以测试参考下。
    2018-07-07
  • 使用feign传递参数类型为MultipartFile的问题

    使用feign传递参数类型为MultipartFile的问题

    这篇文章主要介绍了使用feign传递参数类型为MultipartFile的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • springboot返回modelandview页面的实例

    springboot返回modelandview页面的实例

    这篇文章主要介绍了springboot返回modelandview页面的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 解析SpringBoot中@Autowire注解的实现原理

    解析SpringBoot中@Autowire注解的实现原理

    在开发Java项目时,依赖注入是一种常见的实现方式,SpringBoot框架通过@Autowired注解来实现依赖注入的功能,本文将介绍SpringBoot中 Autowired注解实现的原理
    2023-06-06
  • BeanUtils.copyProperties复制对象结果为空的原因分析

    BeanUtils.copyProperties复制对象结果为空的原因分析

    这篇文章主要介绍了BeanUtils.copyProperties复制对象结果为空的原因分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • java外部类与内部类的关系详解

    java外部类与内部类的关系详解

    本文详细讲解了java外部类与内部类的关系,用代码演示了外部类调用内部类的方法。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论