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

网络服务提供者知道或者应当知道网络用户上优化seo

网络服务提供者知道或者应当知道网络用户,上优化seo,义乌搜客网络科技有限公司,网页与网站的区别与联系如何尽量保证线程安全 可变状态是至关重要的。 所有并发访问都可以归结为如何协调对并发状态的访问,可变状态越少,越容易确保线程安全性。 尽量将域声明为final类型,除非需要它们是可变的。 不可变对象一定是线程安全的。 不可变对象能极大…

如何尽量保证线程安全

  • 可变状态是至关重要的。
    所有并发访问都可以归结为如何协调对并发状态的访问,可变状态越少,越容易确保线程安全性。

  • 尽量将域声明为final类型,除非需要它们是可变的。

  • 不可变对象一定是线程安全的。

     不可变对象能极大地降低并发编程的复杂性。它们更为简单且安全,可以任意共享而无须使用加锁或保护性复制等机制。
    
  • 封装有助于管理复杂性。 在编写线程安全的程序时,虽然可以将所有数据都保存在全局变量,但为什么要这样做? 将数据封装在对象中,更易于维护不变性条件:将同步机制封装在对象中,更易于遵循同步策略。

  • 用锁保护每个可变变量。

  • 当保护同一个不变性条件中的所有变量时,要使用同一个锁。

  • 在执行复合操作期间,要持有锁。

  • 如果从多个线程中访问同一个可变变量时没有同步机制,那么程序会可能出问题。

  • 不要故作聪明地推断不需要使用同步。

  • 在设计过程中考虑线程安全,或者在文档中明确地指出塔不是线程安全的。

  • 将同步策略文档化。

  • 使用ThreadLocal保存状态变量

避免死锁

1.对于资源的加锁时间必须足够短,也就是必要时进行锁
2.访问资源过程中的锁需要按照一致的顺序进行获取,否则需要提升出一个更大的锁来确保资源的获取
3.尽量通过封装的形式,避免将锁暴露给外部,从而造成不必要的资源死锁
4.多数情况下,死锁是由于获取锁的顺序错误锁导致的。
5.避免一个线程同时获取多个锁。
6.避免一个线程在锁内同时占用多个资源,尽量保持一个锁只占用一个资源。
7.尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。 8.

原子性

原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。 在多处理器上实现原子操作就变得有点复杂。

对象类型

  • 对象地址原子读写,线程安全。
  • 并发读不可变状态,线程安全。
  • 并发读写可变状态,非线程安全。

基本类型

  • int,char数值读写,线程安全。
  • long,double高低位,非线程安全。
  • i++ 等组合操作,非线程安全。

可见性

final

  • 初始化final字段确保可见性

volatile

  • 读写volatile字段确保可见性

synchronized

  • 同步块内读写字段确保可见性

happen before

  • 遵守happen before次序可见性

可排序性

Happen Before法则

  • 程序次序法则 如果A一定在B之前发生,happen before

  • 监视器法则 对一个监视器的解锁一定发生在后续对同一个监视器加锁之前

  • Volatile变量法则 写volatile变量一定发生在后续对它读之前

  • 线程启动法则 Thread.start一定发生在线程中的动作之前

  • 线程终结法则 线程中的任何动作一定发生在以下操作的动作之前。

      其它线程检测到这个线程已经终止,从Thread.join调用成功返回,Thread.isAlive()返回false
    
  • 中断法则 一个线程调用另一个线程的interrupt一定发生在另一线程发现中断之前

  • 终结法则 一个对象的构造函数结束一定发生在对象的finalizer之前

  • 传递性 A发生在B之前,B发生在C之前,A一定发生在C之前

 

如果多个线程访问同一个可变的状态变量时,没有使用合适的同步,那么程序就会出现错误。有三种方式可以修复这个问题:

  1. 不在线程之间共享该状态变量
  2. 将状态变量修改为不可变的变量
  3. 在访问状态变量时使用同步

什么是线程安全性

在线程安全性的定义中,最核心的概念就是正确性。 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调用代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。

在线程安全类中封装了必要的同步机制,因此客户端无需进一步采取同步措施。

无状态对象一定是线程安全的。

熟练使用线程安全类

要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量。

并非所有的数据都需要锁的保护,只有被多个线程同时访问的可变数据才需要通过锁来保护。

对非原子的64位操作,如long,double类型的变量,在多线程下存在这样的共享变量时,请把变量定义成volatile

加锁机制既可以确保可见性又可以确保原子性 ,volatile变量只可以确保可见性。

当访问共享的可变数据时,通常需要同步,一种避免使用同步方式就是不共享数据。

满足不可变对象的条件:

  • 对象创建以后其状态不能修改
  • 对象的所有域都是final类型
  • 对象是正确创建的(在对象创建的期间,this引用没有逸出)

final域能确保初始化过程中的安全性

不变模式

在并行程序开发过程中,同步操作似乎是必不可少的。当多线程对同一个对象进行读写操作时,为了保证数据对象对一致性 和正确性,有必要对对象使用同步。故而同步操作对性能有相当对消耗。为了尽可能的去除这些同步操作,提高并行程序的 性能,可以使用一种不可变的对象,依靠对象的不变性,可以确保其在没有使用同步操作的多线程环境下依然始终保持 内部状态的一致性和正确性。

不变模式天生就是多线程友好的,它的核心思想是,一个对象一旦被创建,则它的内部状态将永远不会发生改变。所以,没有 一个线程可以修改其内部状态和数据。

不变模式使用场景介绍

  • 当对象被创建后,其内部状态和数据不再发生任何变化
  • 对象需要被共享、被多线程频繁访问

JAVA的并发控制方式

  • 内部锁
  • 重入锁
  • 读写锁
  • ThreadLocal变量
  • 信号量

隐藏比较深的数据竞争

竞争情况描述线程T1线程T2
编译器将这个表达式扩展成temp=x ,和 x=temp+1x+=1x+=2
下标i和j相同时可能会出现数据竞争a[i]+=1a[j]+=1
指针q和p指向同一个目标时可能会出现数据竞争*q+=2*p+=1
foo函数可能使用参数对一个共享变量进行修改foo(1)foo(2)
即使在指令集,硬件还是会将【edi】对更新操作扩展成独立对对读操作和写操作改add [edi],1add [edi] ,2

 

欢迎工作一到五年的Java工程师朋友们加入Java架构开发:468947140

点击链接加入群聊【Java-BATJ企业级资深架构】:https://jq.qq.com/?_wv=1027&k=5zMN6JB

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导

http://www.lbrq.cn/news/2769391.html

相关文章:

  • 掀浪云网站建设销售成功案例分享
  • 动态网站制作好了在哪里看wordpress seo教程
  • 韶关seo网站关键词怎么优化到首页
  • 数据库服务器seo优化工作怎么样
  • 网站怎么做网络推广seo广告
  • 小网站推荐一个企业搜索引擎优化
  • 网站开发需呀那些技术seo搜索引擎优化试题及答案
  • 购买网站需要注意什么seo推广关键词公司
  • 金华网站建设方案优化如何建立公司网站网页
  • 长沙优化网站价格百度自动点击器下载
  • 选择做华为网站的目的和意义品牌运营岗位职责
  • 网站制作公司 知乎百度云电脑版网站入口
  • 兰州城建设计院网站全球搜索网站排名
  • 网站挂黑链赚钱广州百度竞价开户
  • thinkphp搭建的微网站广告联盟赚钱app
  • 电竞网站建设方案厦门seo关键词
  • 高端网站建设的价格网络推广软文
  • 有没有什么推荐的网站知名网页设计公司
  • 怎么做离线网站营销策划书模板
  • 好一点的网站是怎么做的免费大数据查询平台
  • 做企业网站注意什么优化师助理
  • 企业网站代码模板陕西百度推广的代理商
  • wordpress php学习志鸿优化设计
  • 海南州商城网站建设网页设计排版布局技巧
  • 做网站的术语网络营销方案有哪些
  • 游乐园网站建设长沙互联网推广公司
  • 哪个网站做美食视频软件网站如何注册
  • 博客建站模板全球搜
  • 需求登记网站怎么做百度店铺
  • 烟台网站定制排名国外推广网站
  • CloudDM 新增支持 GaussDB 与 openGauss:国产数据库管理更高效
  • 用随机森林填补缺失值:原理、实现与实战
  • Android Cutout(屏幕挖孔)详解
  • C#WPF实战出真汁13--【营业查询】
  • fastadmin 后台列表自定义搜索
  • 北京JAVA基础面试30天打卡11