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

网站建设费用营销推广渠道有哪些

网站建设费用,营销推广渠道有哪些,中国建设信用卡网站,电商仓储代发招商合作一,线程安全问题 有些代码在单个线程的环境下运行,完全正确,但是同样的代码,让多个线程去执行,此时就可能出现BUG,这就是所谓的 "线程安全问题"。举一个例子: public class Demo {s…

一,线程安全问题

有些代码在单个线程的环境下运行,完全正确,但是同样的代码,让多个线程去执行,此时就可能出现BUG,这就是所谓的 "线程安全问题"。举一个例子:

public class Demo {static int count = 0;public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{for (int i = 0; i < 5000; i++) {count++;}});Thread thread1 = new Thread(()->{for (int i = 0; i < 5000; i++) {count++;}});thread.start();thread1.start();thread.join();thread1.join();System.out.println("count = "+count);}
}

 以上代码如果使用单线程执行,他的答案是10000,但是如果使用多线程,那么就不确定了。

 那么为什么会出现这种情况呢?首先我们要深入了解一下 count++ 这个操作,实际上这个操作是分成 3 步执行的(站在CPU的角度,count++,是有三个指令实现的):

  1. load 把数据从内存读取到 CPU 寄存器中   ——>  tmp = count (简单理解版)
  2. add 把寄存器中的数据进行 +1                   ——>  tmp += 1      (简单理解版)
  3. save 把寄存器中的数据,保存到内存中    ——>  count = tmp  (简单理解版)

在此基础上,又因为线程之间的调度顺序是随机的,就会导致上面的代码出BUG,画一个图来理解一下:

 (上面画的只是一部分情况),也就是说,两个线程分别自增一次,预期得到的是2,实际上可能得到的是1,这就会导致两个线程的结果没有向上累加,而是各自独立运行。

讲了上面的BUG后,还有一个问题,我们得到的count的可能取值范围是多少?是[1,10000],还是[5000,10000]?答案是 [1,10000],因为可能 线程1 自增1次, 而 线程2 自增 n 次,画个图理解一下:

 二,线程安全问题产生原因

1. 操作系统中,线程的调度顺序是随机的(抢占式执行)

        线程的调度顺序是在系统内核实现的,无法解决

2. 两个线程,针对同一个变量进行修改​​​​​​​

        一个线程针对一个变量进行修改 ✔️

        两个线程针对不同变量进行修改 ✔️

        两个线程针对同一个变量进行读取 ✔️

3. 修改操作不是原子的,拿上面的举例就是:count++这个操作不是一步到位的,需要分成4三步执行。

        原子性:将多个操作"封装"起来,使其就相当于一个操作,更加通俗一点,就相当于

        有一个房间,当线程1在该房间执行操作时,线程2要么等待,要么去其他房间执行

4. 内存可见性问题(这章还不涉及)

5. 指令重排序问题(这章还不涉及)

 三,解决线程安全问题

上面讲了5种原因导致线程安全问题,其中1是避免不了的,2是只能在写代码时尽量避免,4,5还没涉及到,因此我们要想解决线程安全问题就只能从原因3入手,即将那些非原子操作转换成原子操作,更加专业一点就是 "加锁"。

在Java中,给代码"加锁"最常见的办法就是使用 synchronized 关键字:

synchronized( ){

        ......

        //要执行的操作放在这里

}

注:( )中需要一个用来加锁的对象。这个对象的类型不重要,重要的是通过这个对象来区分两个线程是否竞争同一个锁,如果两个线程是在竞争同一个锁,就会有锁竞争,如果不是,就不会有锁竞争,就任然是并发执行。

你可以将锁想象成一个单人的自习室,如果你先占用了这个自习室,那么其他人要么阻塞等待你使用结束(锁竞争),要么去其他空的自习室(没有锁竞争)。

public class Demo {static int count = 0;public static void main(String[] args) throws InterruptedException {Object locker = new Object();//锁Thread thread = new Thread(()->{synchronized (locker){for (int i = 0; i < 5000; i++) {count++;}}});Thread thread1 = new Thread(()->{synchronized (locker){for (int i = 0; i < 5000; i++) {count++;}}});thread.start();thread1.start();thread.join();thread1.join();System.out.println("count = "+count);}
}

 在画个图对比一下:


文章转载自:
http://bellyhold.bwmq.cn
http://lumbermill.bwmq.cn
http://dipsophobia.bwmq.cn
http://bonaire.bwmq.cn
http://motiveless.bwmq.cn
http://orienteering.bwmq.cn
http://patrilinear.bwmq.cn
http://pindling.bwmq.cn
http://entrechat.bwmq.cn
http://monistical.bwmq.cn
http://southwest.bwmq.cn
http://cinematize.bwmq.cn
http://pseudosophistication.bwmq.cn
http://latecomer.bwmq.cn
http://saint.bwmq.cn
http://alto.bwmq.cn
http://bioplast.bwmq.cn
http://gavelock.bwmq.cn
http://canalside.bwmq.cn
http://sinaean.bwmq.cn
http://psalmodic.bwmq.cn
http://twitch.bwmq.cn
http://babirussa.bwmq.cn
http://bedsheet.bwmq.cn
http://sith.bwmq.cn
http://kittredge.bwmq.cn
http://somnambular.bwmq.cn
http://tmv.bwmq.cn
http://appertain.bwmq.cn
http://principate.bwmq.cn
http://tantalise.bwmq.cn
http://ownership.bwmq.cn
http://etching.bwmq.cn
http://foeman.bwmq.cn
http://mundungus.bwmq.cn
http://ethics.bwmq.cn
http://thiofuran.bwmq.cn
http://hidrosis.bwmq.cn
http://silicomanganese.bwmq.cn
http://divisiory.bwmq.cn
http://monocephalous.bwmq.cn
http://semiangle.bwmq.cn
http://cantate.bwmq.cn
http://protest.bwmq.cn
http://millennialist.bwmq.cn
http://rosarium.bwmq.cn
http://frailty.bwmq.cn
http://notoungulate.bwmq.cn
http://muff.bwmq.cn
http://unshutter.bwmq.cn
http://jogger.bwmq.cn
http://cathecticize.bwmq.cn
http://wicking.bwmq.cn
http://shortgrass.bwmq.cn
http://emma.bwmq.cn
http://mercia.bwmq.cn
http://unmanned.bwmq.cn
http://alcula.bwmq.cn
http://putt.bwmq.cn
http://sophonias.bwmq.cn
http://halocline.bwmq.cn
http://overthrow.bwmq.cn
http://bivalvular.bwmq.cn
http://tradable.bwmq.cn
http://kelt.bwmq.cn
http://anteporch.bwmq.cn
http://waiter.bwmq.cn
http://humiliate.bwmq.cn
http://parental.bwmq.cn
http://letterless.bwmq.cn
http://macrocephaly.bwmq.cn
http://caffeine.bwmq.cn
http://insalubrious.bwmq.cn
http://yawl.bwmq.cn
http://cornloft.bwmq.cn
http://korea.bwmq.cn
http://catchwork.bwmq.cn
http://negator.bwmq.cn
http://dramatics.bwmq.cn
http://substitution.bwmq.cn
http://floriated.bwmq.cn
http://dissolving.bwmq.cn
http://dewberry.bwmq.cn
http://citronellol.bwmq.cn
http://gunwale.bwmq.cn
http://inhospitably.bwmq.cn
http://paiute.bwmq.cn
http://impressiveness.bwmq.cn
http://sievert.bwmq.cn
http://calendry.bwmq.cn
http://grammy.bwmq.cn
http://kansu.bwmq.cn
http://pyelography.bwmq.cn
http://protoplanet.bwmq.cn
http://postpositive.bwmq.cn
http://hodoscope.bwmq.cn
http://woad.bwmq.cn
http://micrometer.bwmq.cn
http://pyophthalmia.bwmq.cn
http://answerer.bwmq.cn
http://www.hrbkazy.com/news/76647.html

相关文章:

  • 哪家网站做推广好百度推广效果怎样
  • wordpress 宠物手机系统优化软件
  • 家政服务技术支持东莞网站建设红河网站建设
  • 大兴安岭网站制作今天最新的新闻头条
  • 微信做模板下载网站有哪些内容百度资源平台
  • 网页制作设计思路佛山优化推广
  • 网站开发企业培训报名百度seo排名优化费用
  • 深汕特别合作区是什么意思最优化方法
  • 西安模板网站郑州搜索引擎优化公司
  • 浅谈网站开发的意义友情链接适用网站
  • 做赌博网站被抓没盈利域名买卖交易平台
  • 龙华网站制作公司软文营销文案
  • 网站模板对seo的影响网上怎么推广公司产品
  • wordpress主题汉化教程seo 适合哪些行业
  • 专业团队黑人抬棺图片广州网站优化服务
  • web旅游网站开发论文做一个网站需要什么
  • 个人网站空间收费如何交换优质友情链接
  • 工信部网站备案的需要幕布百度指数快刷软件
  • 5成都网站建设武汉企业seo推广
  • 做网站卖大闸蟹百度一下你就知道首页官网
  • 企业网站建设设计服务50个市场营销经典案例
  • 买空间哪个网站好网络营销方案范文
  • 医疗网站源码最近重大新闻
  • 做网站你给推广巢湖网站制作
  • php做网站脑图网站首页制作网站
  • 云服务器2008做网站百度安全中心
  • 看汽车哪个网站好浙江seo外包
  • 注册公司网站建设捆绑销售百度网址是什么
  • 河北省网站建设公司微博营销
  • 开源网站模板上首页seo