Java并发编程---对象锁的同步和异步
来源:互联网 发布:数据融合方法概论 编辑:程序博客网 时间:2024/05/21 11:34
1.概念
1.1 同步:synchronized
同步的概念就是共享,如果不是共享的资源,就没有必要进行同步
1.2 异步:asynchronized
异步的概念就是独立,相互之间不受到任何制约.就好像我们学习http请求的时候,在页面发起的Ajax请求,我们还可以继续操作或浏览页面的内容,二者之间没有任何关系
同步的目的就是为了线程安全,其实对于线程安全来说,需要满足两个特性:
原子性(同步)
可见性
2.代码示例
package com.thread.objectLock;/** * 对象锁的同步和异步问题 * @author lhy * @time 2017.12.22 */public class MyObject { //有锁.同步方法public synchronized void method1(){try {System.out.println(Thread.currentThread().getName());Thread.sleep(4000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//无锁,异步方法public void method2(){System.out.println(Thread.currentThread().getName());}/** * 分析: * t1线程先持有Object对象的Lock锁,t2线程可以以异步的方式调用对象中的非synchronized修饰的方法 * t1线程先持有Object对象的Lock锁,t2线程如果在这个时候调用对象中的同步(synchronized)方法则需等待,也就是同步 * * 同步与异步交互,没有互相影响.同时出现 * 注意:如果数据是同步的或者都是异步的,要加一样的锁,保证数据的一致性 * @param args */public static void main(String[] args) {// TODO Auto-generated method stub final MyObject mo = new MyObject(); Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubmo.method1();}},"t1"); Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubmo.method2();}},"t2"); t1.start(); t2.start();}}
3.代码分析
t1线程先持有Object对象的Lock锁,t2线程如果在这个时候调用对象中的同步(synchronized)方法则需等待
t1线程先持有Object对象的Lock锁,t2线程可以以异步的方式调用对象中的非synchronized修饰的方法
阅读全文