java 线程之对象的同步和异步详解编程语言
2023-06-13 09:20:47 时间
一、多线程环境下的同步与异步
同步: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 关键字即可。
16326.html
cjava相关文章
- java 把对象转成map_Java对象转换成Map[通俗易懂]
- java 上传文件接口_Java接口实现文件上传
- java jce_了解Java JCE的加密
- java传真发送,用Java发送传真解决之道
- java使用md5_Java_MD5的使用「建议收藏」
- Java正则表达式语法规则(具体)
- java基础:数组篇
- native2ascii java_Native2Ascii和Ascii2Native的Java实现
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day04】——Java高级篇
- java同步机制解决多线程安全问题
- Java 设计模式最佳实践:1~5
- java 同步方法的使用 防止多线程同时执行方法详解编程语言
- Java实现文本按照自然段落进行切分详解编程语言
- mybatis异常invalid comparison: java.util.Date and java.lang.String详解编程语言
- 服务Linux启动Java服务:一步步去完成(linux启动java)
- Java axis2.jar包详解及缺少jar包错误分析编程语言
- 实现Java实现Redis集合的技术研究(redis集合java)
- Java学习Linux基础的必要性(java要学linux)
- 处理Redis Java实现高效的过期处理(redisjava过期)
- 时间控制解决Java操作Redis过期时间控制问题(redisjava过期)
- MySQL之Java实现主从复制(java mysql主从)
- Java与MySQL的无缝衔接:实现高效数据操作(java中使用mysql)
- 深入认识Java面试与MySQL及其思考(java面试mysql)
- Java与Oracle同步一种新的数据库模式(java同步oracle)
- java模拟post请求登录猫扑示例分享