当前位置: 首页 > news >正文

做网站在阿里云上面买哪个服务国内比较好用的建筑案例网站

做网站在阿里云上面买哪个服务,国内比较好用的建筑案例网站,惠阳区城市建设规划局网站,软件开发外包管理转载自 对于线程安全的集合类#xff08;例如Vector#xff09;的任何操作是不是都能保证线程安全之前在公众号中问了这个问题#xff1a;对于线程安全的集合类#xff08;例如Vector#xff09;的任何操作是不是都能保证线程安全#xff1f; 三天之内收到120回复#x…转载自 对于线程安全的集合类例如Vector的任何操作是不是都能保证线程安全之前在公众号中问了这个问题对于线程安全的集合类例如Vector的任何操作是不是都能保证线程安全 三天之内收到120回复其中表示不清楚的大概有10人左右认为可以保证线程安全的有大概70人左右认为不能保证线程安全的有50人左右这其中能给出明确解释的有5人。 分别是 赵鹏size方法和get方法如果集合的长度变化了可能抛出异常aold619:去网上查了资料“有条件的线程安全 我们在 7 月份的文件“ 并发集合类”中讨论了有条件的线程安全。有条件的线程安全类对于单独的操作可以是线程安全的但是某些操作序列可能需要外部同步。条件线程安全的最常见的例子是遍历由 Hashtable 或者 Vector 或者返回的迭代器 -- 由这些类返回的 fail-fast 迭代器假定在迭代器进行遍历的时候底层集合不会有变化。为了保证其他线程不会在遍历的时候改变集合进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常独占性的访问是由对锁的同步保证的 -- 并且类的文档应该说明是哪个锁(通常是对象的内部监视器(intrinsic monitor))。 如果对一个有条件线程安全类进行记录那么您应该不仅要记录它是有条件线程安全的而且还要记录必须防止哪些操作序列的并发访问。用户可以合理地假设其他操作序列不需要任何额外的同步。”闫晓琦答不是经常会出现数组越界报错逆风飞扬vector单个的方法 synchronized并不代表vector组合的方法调用具有原子性。有组合的操作还是需要针对vector进行加锁。慕容不是线程安全集合只能保证单个操作安全复合操作同样不安全那么这个问题的正解应该是什么的。 问对于线程安全的集合类例如Vector的任何操作是不是都能保证线程安全 答同步容器中的所有自带方法都是线程安全的因为方法都使用synchronized关键字标注。但是对这些集合类的复合操作无法保证其线程安全性。需要客户端通过主动加锁来保证 如果你看过JDK的源码那么你会发现像Vector这样的同步容器的所有共有方法全都是synchronized的。也就是说我们可以在多线程场景中放心的使用单独这些方法因为这些方法本身的确是线程安全的。那么为什么又说复合操作无法保证线程安全呢这里举个栗子我们定义如下删除Vector中最后一个元素方法 public Object deleteLast(Vector v){int lastIndex   v.size()-1;v.remove(lastIndex); } 上面这个方法是一个复合方法包括size(和remove()乍一看上去好像并没有什么问题无论是size()方法还是remove()方法都是线程安全的那么整个deleteLast方法应该也是线程安全的。但是时如果多线程调用该方法的过程中有remove方法有可能抛出ArrayIndexOutOfBoundsException。我们看一下remove方法具体实现什么情况下会抛出这个异常呢。 public synchronized E remove(int index) {modCount;if (index elementCount)throw new ArrayIndexOutOfBoundsException(index);E oldValue elementData(index);int numMoved elementCount - index - 1;if (numMoved 0)System.arraycopy(elementData, index1, elementData, index,numMoved);elementData[--elementCount] null; // Let gc do its workreturn oldValue; } 从上面代码中可以看出当index elementCount时会抛出ArrayIndexOutOfBoundsException也就是说当当前索引值不再有效的时候将会抛出这个异常。因为removeLast方法有可能被多个线程同时执行当线程一通过index()获得索引值为10在尝试通过remove()删除该索引位置的元素之前线程2把该索引位置的值删除掉了这时线程一在执行时便会抛出异常。 为了避免出现类似问题可以尝试加锁 public void deleteLast() {synchronized (v) {int index v.size() - 1;v.remove(index);} } 如上我们在deleteLast中对v进行加锁即可保证同一时刻不会有其他线程删除掉v中的元素。 至此我们已经解释清楚了我们的问题。 问对于线程安全的集合类例如Vector的任何操作是不是都能保证线程安全 答同步容器中的所有自带方法都是线程安全的因为方法都使用synchronized关键字标注。但是对这些集合类的复合操作无法保证其线程安全性。需要客户端通过主动加锁来保证。 由于我们自己已知Vector等同步容器是线程安全的所以我们通常在多线程场景中会直接拿来使用并不会考虑太多从而可能导致问题。 所以我们在使用同步容器的时候如果只使用其中的自带方法那么可以放心使用因为他们是线程安全的但是如果我们想做复合操作尤其是涉及到删除容器中的元素时一定要注意是否需要客户端主动加锁。 下面我们考虑以下代码如果在多线程场景中使用会不会出现线程安全问题 for (int i 0; i v.size(); i) {System.out.println(v.get(i)); } 显然以上代码在迭代的过程中并不会出现线程安全问题。但是如果在程序中还有以下代码有可能被同时调用呢 for (int i 0; i v.size(); i) {v.remove(i); } 由于不同线程在同一时间操作同一个Vector其中包括删除操作那么就同样有可能发生线程安全问题。所以在使用同步容器的时候如果涉及到多个线程同时执行删除操作就要考虑下是否需要加锁。
http://www.pierceye.com/news/809419/

相关文章:

  • 建设公司网站要注意哪些蜜雪冰城推广软文
  • 做信息安全的网站博客网站的建设
  • 门户网站建设项目书提升学历是什么意思
  • 上海网站建设极简慕枫塘沽有哪些互联网公司
  • 社区网站如何做官方网站建设哪儿有
  • 做兼职的网站策划书大连中山网站建设
  • 中国摄影网站深圳网站建设龙华
  • 个人网站怎么建立深圳网站建站费用
  • 笔趣阁建站教程网页设计 网站建设啥意思
  • 海门网站开发西安响应式网站建设服务提供商
  • 自适应网站建站哈尔滨市建设安全监察网站
  • nas服务器可以做网站吗电商类网站开发方案
  • 免费的个人的网站网站建设 考虑
  • 医院网站建设的目的高端网站有哪些优势
  • 佛山网站建设首选如何备份wordpress
  • 优化稳定网站排名网站建设需要学什么语言
  • 可以做设计私单的网站硬件开发工程师面试
  • 竞价网站单页网页设计师中级证书有用吗
  • 做网站 简单外包wordpress 插件api
  • 白城网站seo新手怎么建立自己网站
  • 建立用模板建立网站wordpress feed
  • 株洲品牌网站建设优质的杭州网站优化
  • 网站开发在哪个科目核算网站平台怎么做的好处
  • 网站底部模板代码江苏建站系统
  • 写出网站开发的基本流程品牌建设网站
  • 河北省建设机械协会网站双减之下托管班合法吗
  • 江门市城乡建设局网站阿里云万网域名购买
  • 网站推广技术哪家好专业网站开发建设
  • 义乌营销型网站建设淘宝做动图网站
  • dedecms能做什么网站素材网站怎么做