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

同步: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 线程之对象的同步和异步的更多相关文章

  1. 【Java面试题】25 同步和异步有何异同,在什么情况下分别使用他们?举例说明。

    如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取. 当应用程序在对象上调用了一个需要花费很长时间 ...

  2. 【Thread】java线程之对象锁、类锁、线程安全

    说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...

  3. java 线程​基本概念 可见性 同步

    开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于J ...

  4. Java对多线程~~~Fork/Join同步和异步帧

    于Fork/Join骨架,当提交的任务,有两个同步和异步模式.它已被用于invokeAll()该方法是同步的.是任何 务提交后,这种方法不会返回直到全部的任务都处理完了.而还有还有一种方式,就是使用f ...

  5. 简单测试Java线程安全中阻塞同步与非阻塞同步性能

    摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>13.2.2 线程安全的实现方法 1.名词解释 同步是指锁哥线程并发访问共享数据时,保证共享数据同一时刻只被一个线程访 ...

  6. ajax对象。同步与异步及ajax发送请求

    ajax对象的属性.方法 属性 readyState: Ajax状态码 * 0:表示对象已建立,但未初始化,只是 new 成功获取了对象,但是未调用open方法 1:表示对象已初始化,但未发送,调用了 ...

  7. Java线程间怎么实现同步

    1.Object#wait(), Object#notify()让两个线程依次执行 /** * 类AlternatePrintDemo.java的实现描述:交替打印 */ class NumberPr ...

  8. Java线程安全与数据同步

    import java.util.HashMap; import java.util.concurrent.TimeUnit; public class Test { public static vo ...

  9. Java系统中如何拆分同步和异步

    很多开发人员说,将应用程序切换到异步处理很复杂.因为他们有一个天然需要同步通信的Web应用程序.在这篇文章中,我想介绍一种方法来达到异步通信的目的:使用一些众所周知的库和工具来设计他们的系统. 下面的 ...

随机推荐

  1. Zabbix proxy 3.2安装部署

    zabbix proxy 前提环境: CentOS 6 LNMP(php) 版本:Zabbix-3.2.3 proxy安装 yum install -y net-snmp \ net-snmp-dev ...

  2. CH1808 Milking Grid

    题意 POJ2185 数据加强版 描述 Every morning when they are milked, the Farmer John's cows form a rectangular gr ...

  3. QLoo graphql engine 学习三 架构

    一张官方的参考图 说明 Storage Layer API 参考了kubernetes 的设计 qloo 组成 qloo 有qloo 服务以及envoy proxy 组合而成,envoy proxy ...

  4. 深入理解java虚拟机,类加载

    1,通过使用静态字段,只有真正定义这个字段的类才会被初始化,(子类不初始化,父类初始化 2,new数组,不初始化 3,通过类来调用一些类的常量,可以不初始化类,(常量在编译期,被优化到NotIniti ...

  5. 常用的acl规则

    一.常用的acl规则        haproxy的ACL用于实现基于请求报文的首部.响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性.其配置法则通常分为两步,首先去定义ACL ...

  6. android studio安装须知

    64位linux,默认会提示mksdcard错误什么的,需要安装一个库 sudo apt- android sdk的下载,自己找代理服务器吧,哎……

  7. Windows Server 2012/win8 iis8 上安装 asp.net 4.5 当时用了mvc5 .net framework 4.5 所以得装下

    vs2013+mvc5 +.net framework 4.5  本地 iisexpress 调试一点问题没有,当部署到本机iis时 出现 无法识别 modules错误,具体错误提示是: 锁定是默认设 ...

  8. 马士兵Spring-AOP-Aspect例子使用(1)

    一.例子1: 1.工程结构: 2. User.java: package com.cy.model; public class User { private String username; priv ...

  9. 记一次 在 HP zbook G3 笔记本上安装Ubuntu16.04LTS 的 心(填)路(坑)旅程

    背景 同事MM申请的新笔记本暂时没有用,问我需不需要用. 本着 “宇宙都是xx的”(厚颜无耻~~)思想就接受了. 拿到本本一看,HP zbook G3, 配置还不错(500G SSD, 16G mem ...

  10. Microsoft SQL Server on Linux破解 2G内存限制

    首先,贴上微软官方安装方法,大家按照官方的操作就行. 微软官方安装方法 相信很多同学遇到一个问题就是: sqlservr: This program requires a machine with a ...