Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >线程:对同步的深入理解

线程:对同步的深入理解
EN

Stack Overflow用户
提问于 2013-12-18 13:25:17
回答 1查看 194关注 0票数 1

我只想在同步的同时对内在机制有一个更深入的了解。我准备了3个例子。我有一些问题涉及到每个问题。下面是第一个例子:

代码语言:javascript
运行
AI代码解释
复制
public class SyncExamples 
{

    SyncClass sync1, sync2;


    public void execute1()
    {
        sync1 = new SyncClass();
        sync1.process();
    }


    public void execute2()
    {
        sync2 = new SyncClass();
        sync2.process();
    }



    class SyncClass
    {

        public synchronized void process()
        {

        }
    }
}

SyncClass的方法进程()是同步的。但是由于在类SyncExamples 中创建了两个不同的对象( of SyncClass ),它们都可以同时执行,不是吗?它们引用不同的对象,因此没有任何同步。是对的吗?

第二个例子:

代码语言:javascript
运行
AI代码解释
复制
public class SyncExamples 
{

    SyncClass sync1 = new SyncClass();


    public void execute1()
    {       
        sync1.process();
    }


    public void execute2()
    {       
        sync1.process();
    }




    class SyncClass
    {

        public synchronized void process()
        {

        }
    }
}

所以在这个例子中,它们引用的对象是相同的。所以这里有一个互斥物。它们是同步的。但让我们来看看我最感兴趣的例子。

代码语言:javascript
运行
AI代码解释
复制
public class SyncExamples 
{

    SyncClass sync1 = new SyncClass();
    ReadWriteLock lock = new ReentrantReadWriteLock(); 


    public void execute1()
    {       
        lock.writeLock().lock();
        sync1.process();
        lock.writeLock().unlock();
    }


    public void execute2()
    {       
        execute1();
    }


    public void execute3()
    {       
        sync1.process();
    }


    public void execute4()
    {       
        execute1();
    }


    class SyncClass
    {

        public void process()
        {

        }
    }
}

execute2()启动execute1()。execute1()锁定sync1.process()。因此,execute4()必须等待,直到sync1.process()被execute1()解锁。但是execute3()呢?它不引用execute1(),而是直接调用sync1.process()而不使用任何锁。因此,execute1()设置的锁对execute3()无效吗?是那么回事吗?该锁仅对引用execute1()的调用有效,因为此方法定义了锁?

一天后我添加了以下示例:

代码语言:javascript
运行
AI代码解释
复制
public class SyncExamples 
{

    List list = new ArrayList(); 


    public void processList1()
    {       
        synchronized(list)
        {
        }
    }


    public void processList2()
    {       
        synchronized(list)
        {
        }
    }


    public void execute3()
    {       
        processList1();
    }


    public void execute4()
    {       
        processList2();
    }
}

我想澄清最后一个例子。现在我有了一个想要同步的列表。方法processList1()同步列表.方法processList2()也会这样做。但它们能同时执行吗?同步是全局锁定列表(我指的是所有来自其他方法的其他访问),还是仅与特定方法结合使用?在本例中,我仍然不明白execute3()和execute4()是否可以同时执行,因为它们引用了不同的方法。同步阻止对其块的第二次访问。但是有几种方法想要访问列表,它们使用自己的同步块。因此,如果processList1()锁定了列表,那么这个列表是否锁定为processList2()?或者这个锁对processList2()无效,因为它是一个不同的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-18 13:33:07

第一个问题:正确

第二种情况:是的,表现得像互斥。

第三个问题:正确

回答编辑

synchronized块使用它的参数对象作为块的锁(或者更好的是互斥对象)。因此,如果两个线程到达同一对象上的关键部分synchronized,则只允许一个线程进入其关键部分,而另一个线程则等待此线程退出关键部分。

synchronized方法只是synchronized块的语法糖,因此

代码语言:javascript
运行
AI代码解释
复制
class SyncClass
{
    public synchronized void process()
    {

    }
}

可以写成

代码语言:javascript
运行
AI代码解释
复制
class SyncClass
{
    public void process()
    {
        synchronized(this)
        {
            // whole body of process() inside this block
        }
    }
}

所以,回答你的问题

  • synchronized将全局锁定list (或任何其他用作其参数的对象),而不只是针对特定的方法。您可以在代码中的任何地方对对象进行同步,并且无论包含的方法/类或调用层次结构如何,同步部分都将以互斥方式运行。
  • processList1()processList2()不会并发执行。一次只能执行一个。(这假设您在synchonized块之外没有代码。)
  • execute3()和execute4()可以并发执行,但只能执行到到达synchronized部分的程度。也就是说,对processList1()processList2()的调用以及这些调用之前的任何代码-- execute3/4()方法可以并发执行,但是synchronized部分中的代码不能并发执行。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20668721

复制
相关文章
网络请求优化——取消请求
我们可能会遇到这样的场景:当用户切换页面时,上个页面存在pending中的请求。积少成多,如此会造成性能浪费,增加服务器压力。本文在于分享基于小程序提供的请求api及 axios 使用中如何取消不必要的请求。
s4rn
2021/01/06
2.2K0
Volley请求
1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通
xiangzhihong
2018/01/30
1.8K0
volley请求原理
Volley 实现原理解析 本文为 Android 开源项目实现原理解析 中 Volley 部分 项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo 分析者:grumoon,校对者:huxian99,校对状态:完成 1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。 名字由来:a burst or emission o
xiangzhihong
2018/01/30
2.2K0
浅谈Volley请求
先简单介绍一下Volley的诞生背景 Volley诞生于 2013年 Google I/O大会上 是Google开发工程师写的一个网络请求框架 特点是进行数据量不大,但通讯频繁的网络操作,内部还封装了图片加载的控件 NetworkImageView 用于直接在网络上面加载图片 本文只是对
后端码匠
2019/12/05
6820
浅谈Volley请求
Android Volley 源码解析(一),网络请求的执行流程
花了好几天,重新研究了 Volley 的源码实现,比起之前又有了一番新的体会,啃源码真的是一件让人纠结的事情,阅读优秀的源码,特别是难度相对较大的源码,一旦陷入代码细节或者情绪一烦躁,很容易让人奔溃,但是真正的啃下来,收获真的很大。从优秀的代码中学习优秀的编程思想以及良好的代码设计和代码风格是一个非常好的方法,这次通读了 Volley 的源码之后,对于 Volley 的代码质量和拓展性深感佩服,为了更好的记录这次的源码研究之旅,写几篇博客记录一下。
developerHaoz
2018/08/20
1.4K0
axios取消请求
在使用Axios发送请求时,有时可能需要取消请求,特别是在用户需要中断请求或离开当前页面时。Axios提供了取消请求的功能,以便有效地管理和处理请求的取消操作。
堕落飞鸟
2023/05/19
2.5K0
Volley网络连接
一、Volley a burst or emission of many things or a large amount at once Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。 二、特点 异步任务下载图片的操作存在几个问题 1、  代码量大且繁琐 2、  ListView滚动太快,可能导致下载的图片无法正常显示 3、  可能浪费系统资源 4、  旋转屏幕可能导致再次下载 由此提出使用Volley替代 网络操作 但是只适合简单的网络操作: 1、  json/xml
听着music睡
2018/05/18
1.8K0
Volley使用JsonObjectRequest发送Post请求失败
这段时间一直在忙比赛,开发一个Android应用。转眼间博客竟然这么久没更新了,罪过罪过…这两天在用Volley框架,但是当我使用JsonObjectRequest发送Post请求时,竟然失效了。服务器一直响应失败,搞了半天,在StackOverFlow上找到了类似的问题,终于解决掉了。
零式的天空
2022/03/22
2.1K0
AJAX取消请求
在进行 AJAX(Asynchronous JavaScript and XML)请求时,有时候我们需要取消正在进行的请求。取消请求可以帮助我们提高用户体验,并减少不必要的网络流量和服务器负载。
堕落飞鸟
2023/05/19
2K0
axios 取消请求
官方文档:http://www.axios-js.com/zh-cn/docs/#%E5%8F%96%E6%B6%88
小鑫
2022/04/24
1.6K0
如何取消 Fetch 请求
JavaScript 的 promise一直是该语言的一大胜利——它们引发了异步编程的革命,极大地改善了 Web 性能。原生 promise 的一个缺点是,到目前为止,还没有可以取消 fetch 的真正方法。JavaScript 规范中添加了新的 AbortController,允许开发人员使用信号中止一个或多个 fetch 调用。
疯狂的技术宅
2020/03/26
2.4K0
如何取消 Fetch 请求
如何通过抓包分析EasyCVR级联时不回复上级平台的invite请求?
EasyCVR平台基于云边端协同架构,可支持多协议、多类型的海量设备接入与分发,平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,在线下均有大量应用。
TSINGSEE青犀视频
2023/06/28
1820
Axios 取消重复请求
项目地址:https://github.com/Ewall1106/mall 有什么用? 当用户频繁点击在短时间内发送多个 ajax 请求,但是由于网络原因服务器数据无法及时响应返回,这时候,就会有可能造成前端页面数据不匹配的情况。 具体场景来说,在用户网速不好的情况下的比如搜索框 onchange 事件的模糊搜索、触底刷新请求列表数据、tab 栏的高频切换等等。 再者,这样也浪费服务器资源,也是性能优化的一种必要手段。 基本使用 官网地址:Axios-CancelToken 官网的基本示例如下。 c
Ewall
2020/11/12
1.5K0
取消(中止)异步请求
问题描述:动态获取图片宽、高。由于图片大小不一,导致异步请求返回时间有差异,频繁操作导致渲染结果出现问题。
奋飛
2021/12/30
1.2K0
取消(中止)异步请求
取消(中止)异步请求
问题描述:动态获取图片宽、高。由于图片大小不一,导致异步请求返回时间有差异,频繁操作导致渲染结果出现问题。
奋飛
2021/09/07
1.1K0
Android知识浅积累——Volley篇#Android网络框架Volley
http://blog.csdn.net/jdsjlzx/article/details/40738181
代码咖啡
2018/08/28
4830
Android知识浅积累——Volley篇#Android网络框架Volley
Carson带你学Android:主流开源网络请求库对比(Volley、OkHttp、Retrofit)
前言 网络请求在 Android 开发中非常常见,为了降低开发周期和难度,我们经常会选用网络请求的开源库 而现在网络请求的开源库越来越多,我们应该选用哪种呢? 今天我就给大家分别介绍 & 对比现今主流的网络请求库。 目录 1. 为什么要用网络请求开源库? 网络请求开源库是一个将 网络请求的相关功能封装好的类库 没有网络请求框架之前 App想与服务器进行网络请求交互是一件很痛苦的事:因为Android的主线程不能进行网络请求,需另开1个线程请求、考虑到线程池,缓存等一堆问题 使用网络请求库后
Carson.Ho
2022/03/24
6080
Carson带你学Android:主流开源网络请求库对比(Volley、OkHttp、Retrofit)
Android Volley完全解析(二),使用Volley加载网络图片
用户1158055
2018/01/05
1.3K0
Android Volley完全解析(二),使用Volley加载网络图片
当我们在谈免费游戏时
技术改变思想 本来不想用“当我们在谈XXX的时候,我们在谈什么”这种俗气的标题,但这个文章的内容,确实在一些人的想法里,还是有那么一点俗气的。所以用这个标题,也算文题对应吧。免费游戏,道具收费(Free To Play)作为一种游戏类型的存在,似乎是一个最近10年才开始的事情,但在中国,这种类型几乎成为了唯一的游戏类型。一切产品,都是因为有用户的市场需求才会存在,但是免费游戏这个市场,又是如何被挖掘出来的呢?——这对于看清楚免费游戏背后的用户需求,应该是有很多好处的。 2006年的某天,我的老板给我打了个
韩伟
2018/03/05
2.3K1
当我们在谈免费游戏时
点击加载更多

相似问题

如何使connect/express在特定目录上使用未过期的缓存?

21

过期后运行Javascript计时器

10

如何使NSIS RMDir在子目录上运行?

33

在多个子目录上运行代码

01

C#计时器-在计时器运行时运行代码

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档