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

凉山州城乡规划建设局网站长沙网站建设哪家强

凉山州城乡规划建设局网站,长沙网站建设哪家强,东莞营销专业网站建设,灌南网页定制关键字 synchronized 可以保证在同一时刻#xff0c;只有一个线程可以执行某一个方法#xff0c;或者某一段代码块。许多程序员把同步的概念仅仅理解为一种互斥的方式。即#xff0c;当一个对象被一个线程修改的时候#xff0c;可以阻止另一个线程观察到内部不一致的状态。…关键字 synchronized 可以保证在同一时刻只有一个线程可以执行某一个方法或者某一段代码块。许多程序员把同步的概念仅仅理解为一种互斥的方式。即当一个对象被一个线程修改的时候可以阻止另一个线程观察到内部不一致的状态。 这种观点是正确的但是它并没有说明同步的全部意义。如果没有同步一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态之中它还可以保证进入同步方法或代码块的每个线程都看到由一个同步锁保护的之前所有的修改效果。 你可能听说过为了提高性能在读或者写原子数据的时候应该避免使用同步。这个建议是非常危险而错误的。虽然语言规范保证了线程在读取原子数据的时候不会看到任意的数值但是它并不保证一个线程写入的值对于另一个线程将是可见的。为了在线程间进行可靠的通信也为了互斥访问同步是必要的。这归因于 java 语言规范中的内存模型它规定了一个线程所做的变化何时以及如何变成对其他线程可见。 如果对共享的可变数据的访问不能同步其后果将非常可怕即使这个变量是原子可读写的。 测试以下代码 public class StopThread {private static boolean stop;public static void main(String[] args) throws InterruptedException {System.out.println(LocalDateTime.now());Thread t new Thread(()-{int i 0;while(!stop){i;}System.out.println(LocalDateTime.now());});t.start();Thread.sleep(1000);stop true;} } 看上去这段代码的意思就是1s 之后停止但实际上它根本不会停止后台线程永远在循环 问题在于没有同步就不能保证后台线程什么时候会发现主线程修改了 stop 的值 想要修复的这个问题可以加上同步操作 public class StopThread {private static boolean stop;private static synchronized void setStop(){stop true;}private static synchronized boolean getStop(){return stop;}public static void main(String[] args) throws InterruptedException {System.out.println(LocalDateTime.now());Thread t new Thread(()-{int i 0;while(!getStop()){i;}System.out.println(LocalDateTime.now());});t.start();Thread.sleep(1000);setStop();} } 注意在上面的修改中写和读方法都添加了同步关键字。如果只有一个则可能无效读和写是两个动作都需要被同步才能真正完成同步。 synchronized 关键字由java 自动帮我们处理为锁实际上针对上面的要求我们可以用一个更简单高效的关键字来处理volatile 也就是在stop 前加上 volatile 修饰就可以了不需要再用 同步处理读和写。volatile 不提供锁和互斥操作它只保证内存可见性这里我们需要的也就是内存可见性——任何线程所修改之后立刻被其他线程所见。 所以要正确区分 synchronized 和 volatile 。synchronized 提供互斥操作也就是任意时刻所修饰的代码块或方法只能有一个线程在执行。而volatile 只能保证可见没有互斥性。 以下代码可以做个试验 private static volatile int count 0; public static void main(String[] args) throws InterruptedException {for(int x 0;x10;x){new Thread(() -{for(int i 0;i1000;i){count ;}}).start();}Thread.sleep(2000); // 保证多线程已经结束System.out.println(count); } 多次执行之后你会发现count 不一定是 10000大概率是9000多。 因为 voletile 只可见不提供互斥而 count 实际上是3个动作先读取count 值然后1 最后写回到count 值 所以可能发生 2个或多个线程同时读取到 count 比如 6然后同时在内存中计算出 7最后都写回7.这样6经过2次自增结果却是7 。多次循环下来最后结果就是不到10000 这样的需求就只能使用同步或者锁 或者 原子类。 综上如果需要多线程一定要注意互斥性。如果只需要可见则需要 volatile 可见性。如果无法确认多数时候还是用互斥比较稳妥至少保证程序不出错。 多线程编程中一定要注意并且这种bug 非常难以处理。在debug 环境下往往无法复现真正的多线程中的大量并发也就很难复现这样的错误。
http://www.w-s-a.com/news/463001/

相关文章:

  • 广州网站开发创意设计公司企业自己怎么制作网站首页
  • 曲靖 曲靖网站建设软件(app)开发wordpress 没有远程发布
  • 官方网站开发与定制网站建设技术是干嘛的
  • 昆明网站建设工作室网站菜单导航怎么做的
  • 南京网站做的好的公司猪八戒网站做推广怎么样
  • 建站收费标准福州网站搭建
  • 做防护用品的网站欧美网站建设风格特点
  • 龙华做网站联系电话北京软件开发培训班
  • 做网站运营有前途网站的建设与管理的心得体会
  • 河南网站推广怎么做网页制作免费下载
  • 网站如何屏蔽中国ip商丘网站建设的公司哪家好
  • 东莞广告公司东莞网站建设价格鹤壁哪有做网站的
  • 门户网站界面设计logo设计商标设计
  • 建设银行网站驱动宁波网站建设相信荣胜网络
  • 八里河网站建设项目建设可行性企业品牌推广方式有哪些
  • jsp网站开发之html入门知识广州服装设计公司
  • 做电商看的网站有哪些个人网页制作成品免费
  • 沈阳建站多少钱境外网站 备案
  • 提交网站收录入口斗图在线制作
  • 建设化妆品网站服务医药网站前置审批
  • 购物网站修改注册信息模块的分析怎么注册公司logo
  • 那个网站可以做域名跳转的青岛网站建设定制
  • 网站登记模板互联网技术发展及其影响的调查
  • 北京专业的网站建设西安企业家名单
  • 移动网站开发服务器丰都集团网站建设
  • 网站开发逻辑图烫画图案设计网站
  • 客户管理系统哪找公司网站如何做优化
  • 常德企业网站建设广州站在哪里
  • 移动端网站建站视频教程网站如何做淘客
  • 注册网站会不会有风险网站建设实训致谢语