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

广州市城乡和建设局网站杭州网站建设怎么样

广州市城乡和建设局网站,杭州网站建设怎么样,seo门户网站优化,wordpress设置连接地址synchronized是什么synchronized是Java关键字#xff0c;为了维护高并发是出现的原子性问题。技术是把双刃剑#xff0c;多线程并发给我带来了前所未有的速率#xff0c;然而在享受快速编程的过程#xff0c;也给我们带来了原子性问题。如下#xff1a;public class Main …synchronized是什么synchronized是Java关键字为了维护高并发是出现的原子性问题。技术是把双刃剑多线程并发给我带来了前所未有的速率然而在享受快速编程的过程也给我们带来了原子性问题。如下public class Main {private static int i 0;public static void main(String[] args) throws InterruptedException {Main main new Main();Thread a new Thread(() - {main.add10K();}, A); // 线程AThread b new Thread(() - {main.add10K();}, B); // 线程Ba.start(); // 启动线程Ab.start(); // 启动线程Ba.join(); // 等待线程A执行完毕b.join(); // 等待线程B执行完毕System.out.println(i); // 打印i的值期望20000}// 10000操作public void add10K(){for (int j 0; j 10000; j) {i;}} }上面的程序你细细品味一下结果会是多少然后再回来看下面的结果。或者自己编程一下上面的代码然后带着思考运行一下面试高频点。下面的分析请耐心看并思考。这就是面试要跟面试官聊的东西聊越多聊越细证明你思考得越多。答案是小于20000其实了解过JVM的同学都知道i在CPU中其实不是一条CPU指令而是三条。读取i的值对i进行1操作装载i的值。那么多线程并发其实就是每个线程分配一个时间片执行时间片执行完毕后就轮到下一个线程。在上面的程序可能会发生的事情当线程A做到第2步的时候对i进行1操作可能时间片得分给线程B了此时线程A和线程B假设都读到i的值为0这时线程B对i进行了1操作后i的值为1然后轮到线程A执行线程A此时到了第三步把刚才i1的值装载回去i1。问题就在这了期望两个线程对i都1后期望值应该为2然而此时却为1。这种情况还不少见所以导致最终的结果小于期望值20000。那么怎么解决这个问题呢通过上面得分析我们知道就是操作系统搞着时间片轮转运行造成的不要轮转不就行了确实可以。但是如果这么做了又回到单线程时代况且现在已经不是单核时代了每个人得电脑至少双核起步吧所以思路是对的但是现实场景是骨感的。那么有没有一个可能就是在线程A对i进行1操作的时候我把i这个参数给他锁住先不要让别的线程操作它呢这就对了现在的synchronized、Lock就是这个思想在操作某个变量时我先在这个变量前面加个栅栏也可以理解成锁只有当我撤了这个栅栏或者撤了这把锁其他人才可以对这个变量进行操作这不就没什么问题了。synchronized其实就是利用这个原理做的这个关键字但是它是隐式的没有展现出来但是其实在底层的汇编指令它其实是有展现的带你们看一下。这是Java代码public class Main {public static void main(String[] args) throws InterruptedException {}public void operate(){synchronized(this){}}}这是汇编指令JVM自己约定的汇编指令所以我加了双引号。这个是通过Javap -c Main.class指令得到的大家有兴趣可以试试可以看到上图我画圈圈的东西monitorenter、monitorexit、monitorexit这其实就是synchronized的两个隐式锁指令了monitorenter代表加锁monitorexit代表解锁。为什么monitorexit有两个呢原因其实也很简单为了预防死锁用的因为我们正常情况下当然是一个解锁就可以了万一没运行到解锁那一行程序挂了呢那此时是不是在异常时设置一条解锁会好点所以两个monitorexit是有道理的synchronized作用范围锁非静态方法public class Main {public static void main(String[] args) throws InterruptedException {}public synchronized void operate(){}}像上面的程序锁的就是方法这个方法是来源某个实例的所以根据传递原则其实锁的就是你new出来的那个实例应该很好理解。下面来个例子带你走走坑。这个程序代码务必认真看比你看100篇synchronized讲解有用因为很多都是走马观花没有落实到具体实践讲解只让你知道锁的是实例而实际场景中遇到的坑你可能自己都理所当然不知所以。public class Main {public static void main(String[] args) throws InterruptedException {A a new A();B b new B();a.addMoney(b.money);}}class A {public Integer money 100;public synchronized void addMoney(Integer targetMoney){money targetMoney;System.out.println(money);}}class B {public Integer money 200;}问题假设在执行addMoney方法的时候有其他线程修改了B的money为300那么addMoney执行的结果是什么呢思考一下可以评论区说一下答案理解这个真的很重要。这是synchronized最关键的点了我先设个坑评论区回答认真看的因为真的很重要、很重要、很重要。非静态代码块public class Main {public static void main(String[] args) throws InterruptedException {A a new A();B b new B();a.addMoney(b.money);}}class A {public Integer money 100;public void addMoney(Integer targetMoney){synchronized(this){money targetMoney;System.out.println(money);}}}class B {public Integer money 200;}跟锁非静态方法其实一样的就是锁的实例也存在上面的问题所以说他真的很重要笔试很容易就把分丢了面试很容易就把印象说没了。public class Main {public static void main(String[] args) throws InterruptedException {A a new A();B b new B();a.addMoney(b.money);}}class A {public Integer money 100;public void addMoney(Integer targetMoney){synchronized(Main.class){money targetMoney;System.out.println(money);}}}class B {public Integer money 200;}这个就不一样了哦我换成了Main.class说明锁的是对象那么有关该对象的变量和方法都会被锁住哦其他形成访问该类的东西时都会阻塞等待该线程释放锁。锁静态方法public class Main {public static void main(String[] args) throws InterruptedException {A a new A();B b new B();a.addMoney(b.money);}}class A {public Integer money 100;public static void addMoney(Integer targetMoney){synchronized(Main.class){}}}class B {public Integer money 200;}这个跟锁静对象一样锁的就是类解释如上。synchronized的优化JDK1.6之后JDK有对synchronized关键字进行了优化主要是做了一些锁升级的过程无锁--偏向锁--轻量级锁--重量级锁。好好读下文这个也很重要不懂评论区留言看到必回反向思考一下加这个synchronized是为了干嘛不就是为了当某个线程操作某个变量的时候不然其他线程操作该变量吗那就是阻塞咯。这个阻塞其实也就是我们上面一直讲解的重量级锁确实一开始就是这样JDK1.6之前。那这很损耗性能的耶所以搞JDK那群家伙就开始想办法优化这些思想了我把synchronized做成一个动态化锁。无锁如果程序不会造成线程安全的那我把synchronized去掉变成无锁化。如下程序只对i进行读操作我锁它干嘛public class Main {public static void main(String[] args) {A a new A();a.readI();}}class A {public Integer i 100;public synchronized void readI(){System.out.println(i);}}看似有锁其实我们从汇编指令看已经被JDK偷偷优化成无锁了。偏向锁但是实际场景可不是一直读哦也会有某个线程一直在那里频繁的写写写但是也无所谓啦以为就你这个线程是把那我就在实例对象头那里直接把偏向锁ID设置成你这个线程ID就可以了只要是你这个家伙来访问这个变量我直接也把锁优化掉。Idea开启偏向锁VM参数-XX:UseBiasedLocking偏向锁开启后默认是4秒才会生效没有等4秒直接用没使用到偏向锁non-biasablepublic class Main {public static void main(String[] args) throws InterruptedException {// TimeUnit.SECONDS.sleep(5);A a new A();new Thread(()-{a.writeI();}).start();// 打印一下加锁后的实例a的对象头信息System.out.println(ClassLayout.parseInstance(a).toPrintable());}}class A {public Integer i 100;public synchronized void writeI(){i 1;}}这里顺带说一下对象头的打印是使用了ClassLayout工具类可以在maven添加以下两个依赖使用dependencies!--查看对象头工具--dependencygroupIdorg.openjdk.jol/groupIdartifactIdjol-core/artifactIdversion0.9/version/dependencydependencygroupIdorg.openjdk.jol/groupIdartifactIdjol-core/artifactIdversion0.16/version/dependency /dependencies等待4秒使用偏向锁value为偏向锁IDpublic class Main {public static void main(String[] args) throws InterruptedException {TimeUnit.SECONDS.sleep(5);A a new A();new Thread(()-{a.writeI();}).start();// 打印一下加锁后的实例a的对象头信息System.out.println(ClassLayout.parseInstance(a).toPrintable());}}class A {public Integer i 100;public synchronized void writeI(){i 1;}} 轻量级锁偏向锁其实指的是一般都是某个线程进行变量操作但是实际场景其实是有多个线程进行操作的因此在其他线程检查操作的对象头不是自己的ID时通过CAS尝试再次获取锁获取不到则转变成轻量级锁获取到了就还是偏向锁。重量级锁这个场景一般是高并发时都是重量级因为有多个线程同时操作同个共享资源。如果按锁的锁的升级流程无非就是浪费时间。以上则是synchronized的所有概述欢迎共勉。
http://www.hkea.cn/news/14519050/

相关文章:

  • 红色网站 推荐免费的源码分享网站
  • 6东莞做网站开放平台是干什么的
  • 行业网站建设方案成都网页设计公司推荐
  • 做58招聘网站工作人员的心得wordpress搬家 登录报错
  • 奢做品二手 哪个网站好酒店 深圳 网站建设
  • 公司注册地址和经营地址搜索引擎优化的实验结果分析
  • 常州转化率网站建设公司怎么样天津全包圆装修公司电话
  • 定远县可以做网站的地方上海找做网站公司
  • 锦州网站建设推广锡山区企业网络推广
  • 直播网站开发方案ppt市场营销策略模板
  • 上海网站建设口碑最好的公司做网站公司上什么平台
  • photoshop设计一个精美的网站主页北京的网页设计
  • 怎么做seo网站推广谁做网站收录
  • 植物网站设计方案电子商务网站整体策划
  • 网址导航网站有哪些网站制作小图标
  • 做网站排名要懂那些我的南京网站
  • 品牌型网站的设计网页设计好学吗
  • 建网站的公司哪里好郑州电商运营培训
  • 求做外宣图网站asp.net 网站开发
  • 任务发布网站建设我的世界做壁纸网站
  • 国际化网站野花社区在线观看高清视频动漫
  • 新余做网站手机百度高级搜索
  • 百度创建网站吗个人网站备案所需材料
  • 营销型网站策划设计怎么查找网站是谁做的
  • 安县移动网站建设河南省工程造价信息网官网
  • 公司网站建设外包流程代备案域名30元
  • 外网常用网站我要自学网视频教程
  • 深圳商业网站建设哪家专业全面加强基层基础建设
  • 成都h5模板建站易语言做网站教程
  • 重庆今天刚刚发生的重大新闻seo推广价格