对象锁的同步和异步

简介: 同步:synchronized同步的概念就是分享,共享,如果不是共享的资源,就没有必要进行同步。异步:asynchronized异步的概念就是独立,相互之间不受到任何制约。就好像http,在页面发起Ajax的请求,我们还可以继续浏览或操作页面的内容,二者之间没有任何关系。

同步:synchronized
同步的概念就是分享,共享,如果不是共享的资源,就没有必要进行同步。

异步:asynchronized
异步的概念就是独立,相互之间不受到任何制约。就好像http,在页面发起Ajax的请求,我们还可以继续浏览或操作页面的内容,二者之间没有任何关系。

同步的目的就是为了线程安全,其实对于线程安全来说,需要满足两个特性:

  • 原子性(同步)
  • 可见性

Java里同步和异步的概念,如果一个class类里有两个方法,一个叫做p1,一个叫做p2,如果p1加上synchronized修饰了,那么p1这个方法就叫做同步方法, p2没有加synchronized修饰,也没有采用任何锁的机制,那么p2就是一个异步方法。

同步和异步方法的区别,无非就是在多个线程访问p1这个方法时,这几个线程只能排队去等待,一个线程执行完了,第二个线程才能进来,如果多个线程访问p2,就可以并发着访问。

/**
 * 对象锁的同步和异步问题
 *
 */
public class MyObject {

    public synchronized void method1(){
        try {
            System.out.println(Thread.currentThread().getName());
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    /** synchronized */
    public void method2(){
            System.out.println(Thread.currentThread().getName());
    }
    
    public static void main(String[] args) {
        
        final MyObject mo = new MyObject();
    
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                mo.method1();
            }
        },"t1");
        
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                mo.method2();
            }
        },"t2");
        
        t1.start();
        t2.start();
        
    }
    
}

分析:
t1线程先持有object对象的Lock锁,t2线程可以以异步的方式调用对象中的非synchronized修饰的方法

t1线程先持有object对象的Lock锁,t2线程如果在这个时候调用对象中的同步(synchronized)方法则需等待,也就是同步

相关文章
|
移动开发 Java 开发工具
Android客户端三步完成支付宝支付SDK接入
Android客户端三步完成支付宝支付SDK接入
2412 0
|
3月前
|
机器学习/深度学习 人工智能 算法
GSPO:Qwen让大模型强化学习训练告别崩溃,解决序列级强化学习中的稳定性问题
这是7月份的一篇论文,Qwen团队提出的群组序列策略优化算法及其在大规模语言模型强化学习训练中的技术突破
1088 0
GSPO:Qwen让大模型强化学习训练告别崩溃,解决序列级强化学习中的稳定性问题
|
5月前
|
存储 数据可视化 搜索推荐
数据可视化实战:如何采集并分析马蜂窝上的热门旅游信息?
通过自动化工具抓取马蜂窝旅游数据,分析杭州热门景点与用户关注焦点,生成排行榜和词云图。项目采用低成本方案,结合Playwright模拟浏览器行为采集信息,并用Python处理数据、绘制图表。结果显示西湖、灵隐寺等为热门景点,游客多关注门票、交通等问题。此方法简单高效,适合个性化旅行攻略分析。
423 8
数据可视化实战:如何采集并分析马蜂窝上的热门旅游信息?
|
存储 移动开发 关系型数据库
HarmonyOS 鸿蒙面试第一弹
HarmonyOS 鸿蒙面试第一弹
|
人工智能 自然语言处理 OLAP
AnalyticDB向量检索助力钉钉AI助理
2024年1月9日钉钉发布人人可用的AI助理产品,用户点击钉钉首屏右上角的魔法棒,即可唤起AI助理进行对话式数据AI、信息摘要、写工作总结、写文档等工作。AnalyticDB for PostgreSQL (下文简称ADB-PG) 向量检索引擎提供了核心实体的向量召回,帮助AI助理在智能问数等场景中大幅提升模型输出准确性。
1256 6
npm 包本地调试(详细流程:包本地路径、npm link 、yalc)
npm 包本地调试(详细流程:包本地路径、npm link 、yalc)
1164 0
|
IDE Java 开发工具
Java-jdk 11或17 文件路径中没有jre文件
Java-jdk 11或17 文件路径中没有jre文件
2216 0
|
图形学
Unity 动态加载Animator Event 事件
搬迁原来博客海澜CSDN 前一阵子频繁更改模型,总是手动添加动画事件 animator events一直比较麻烦,我就想能不能动态的生成对应的动画事件呢,然后找了一些资料,试了下感觉还不错,分享给大家,欢迎大家留言交流~需要注意的是修改后的动画事件重新动态加载后依然保留,猜测注册修改的是元数据,除非注销或者程序停止才能恢复。
2142 0
|
Web App开发 jenkins 测试技术
python+pytest单元测试框架之在Jenkins上生成Allure测试报告
上篇我们通过Allure插件生成了测试report,并通过打开浏览器的方式查看图形化测试report,那要集成都Jenkins中去,并以邮件的方式发送测试report要怎么做呢?请看以下操作 一、搭建环境 1.
5032 0