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

微信公众号的微网站怎么做网站弹出咨询这个怎么做

微信公众号的微网站怎么做,网站弹出咨询这个怎么做,苏州seo优化,没有网站怎么做链接视频对于多线程共享资源的情况须要进行同步#xff0c;以避免一个线程的修改被还有一个线程的修改所覆盖。最普遍的同步方式就是synchronized。把代码声明为synchronized。有两个重要后果#xff0c;一般是指该代码具有 原子性#xff08;atomicity#xff09;和 可见性#x… 对于多线程共享资源的情况须要进行同步以避免一个线程的修改被还有一个线程的修改所覆盖。最普遍的同步方式就是synchronized。把代码声明为synchronized。有两个重要后果一般是指该代码具有 原子性atomicity和 可见性visibility。 1、原子性强调的是运行。意味着个时刻仅仅有一个线程可以运行一段代码这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。 2、可见性强调的是结果。它要对付内存缓存和编译器优化的各种反常行为。它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的还有一个线程是可见的。 同步方法 看一个样例就明确了: import java.util.Random; public class TestSyncClass {  private int num0;    private Random randomnew Random();    public synchronized void testAdd1(){   System.out.println(testAdd1---);   num;   try {    Thread.sleep(1000);   } catch (InterruptedException e) {    e.printStackTrace();   }   System.out.println(1-result--num);  }    public synchronized void testAdd2(){   System.out.println(testAdd2---);   num;   try {    Thread.sleep(1000);   } catch (InterruptedException e) {    e.printStackTrace();   }   System.out.println(2-result--num);  }    public  void testAdd3(){   System.out.println(testAdd3---);   num;   try {    Thread.sleep(1000);   } catch (InterruptedException e) {    e.printStackTrace();   }   System.out.println(3-result--num);  }    public static void main(String[] args) {   final TestSyncClass syncClassnew TestSyncClass();   Thread thread1new Thread(){    Override    public void run() {     syncClass.testAdd1();     super.run();    }   };      Thread thread2new Thread(){    Override    public void run() {     syncClass.testAdd2();     super.run();    }   };      Thread thread3new Thread(){    Override    public void run() {     syncClass.testAdd3();     super.run();    }   };      thread1.start();   thread2.start();   thread3.start();  } } 代码执行结果 testAdd1--- testAdd3--- 1-result--2 3-result--2 testAdd2--- 2-result--3 代码中testAdd1、testAdd2是被synchronized声明的方法。testAdd3没有声明。在执行的时候因为testAdd3没有被声明所以在紧跟着開始执行testAdd1的时候也执行了testAdd3。结果testAdd1执行的结果被testAdd3的结果覆盖了打印了同样的值3。这个主要是可见性的问题。因为testAdd2也是被声明过的所以testAdd2并没有马上执行。而是等testAdd1执行完之后才開始执行。 全部对象都自己主动含有单一的锁也称为监视器monitor object。当在对象上调用其随意synchronized方法的时候此对象都被加锁。这时该对象上的其它synchronized方法仅仅有等到前一个方法调用完成并释放了锁之后才干被调用。 针对每一个类也有一个锁作为类的Class对象的一部分。所以synchronized static 方法能够在类的范围内防止对static数据的并发訪问。 同步块 不管何种情况要想锁住代码必须使用同样的锁。比如把testAdd2改成         private Object objectnew Object();  public void testAdd2(){   synchronized(object){    System.out.println(testAdd2---);    num;    try {     Thread.sleep(1000);    } catch (InterruptedException e) {     e.printStackTrace();    }    System.out.println(2-result--num);   }  } 则testAdd2和testAdd1就不会相互等待了。结果例如以下 testAdd2--- testAdd3--- testAdd1--- 3-result--3 2-result--3 1-result--3 事实上synchronized(object)是更安全的上锁方式。由于直接声明方法的形式用的是类的锁而声明代码块的形式用的是私有属性的锁尤其是在server开发的时候外面类的锁非常easy被黑客获取。从而获取了攻击server的入口而私有属性的私有性让黑客难以获取所以它的锁就相对安全的多。 类同步 上面的main方法的三个线程用的是同一个TestSyncClass syncClass对象。假设每一个线程都各自创建一个对象就不能达到锁定代码的目标了。要想达到同步的目的代码须要改动成例如以下 import java.util.Random; public class TestSyncClass {  private int num 0;  private static Object object new Object();  private Random random new Random();  public void testAdd1() {   synchronized (object) {    System.out.println(testAdd1---);    num;    try {     Thread.sleep(1000);    } catch (InterruptedException e) {     e.printStackTrace();    }    System.out.println(1-result-- num);   }  }  public void testAdd2() {   synchronized (object) {    System.out.println(testAdd2---);    num;    try {     Thread.sleep(1000);    } catch (InterruptedException e) {     e.printStackTrace();    }    System.out.println(2-result-- num);   }  }  public void testAdd3() {   System.out.println(testAdd3---);   num;   try {    Thread.sleep(1000);   } catch (InterruptedException e) {    e.printStackTrace();   }   System.out.println(3-result-- num);  }  public static void main(String[] args) {   Thread thread1 new Thread() {    Override    public void run() {     TestSyncClass syncClass new TestSyncClass();     syncClass.testAdd1();     super.run();    }   };   Thread thread2 new Thread() {    Override    public void run() {     TestSyncClass syncClass new TestSyncClass();     syncClass.testAdd2();     super.run();    }   };   Thread thread3 new Thread() {    Override    public void run() {     TestSyncClass syncClass new TestSyncClass();     syncClass.testAdd3();     super.run();    }   };   thread1.start();   thread2.start();   thread3.start();  } } 执行结果 testAdd1--- testAdd3--- 3-result--1 1-result--1 testAdd2--- 2-result--1 事实上使用synchronized (TestSyncClass.class)类的锁也能达到类似的效果可是考虑到私有属性的安全性就直接使用上面代码做实例了。 注意synchronized是不能继承的父类中synchronized的声明在子类的继承过程中须要再次声明否则synchronized将会丢失。 wait(), notify()。notifyAll() 基类不光有锁。还有这三个方法。wait()会让获取锁的线程等待并释放锁直到notify()或notifyAll()唤醒并又一次获取锁。先看一个样例 public class TestSyncClass {  private int num 0;  private Object object new Object();  private Object object1 new Object();  public  void testAdd(int index) {   System.out.println(testAdd index ---);   synchronized (object) {    num;    try {     object.wait();    } catch (InterruptedException e) {     e.printStackTrace();    }    System.out.println(index -result-- num);   }  }  public void release() {   synchronized (object) {    object.notifyAll();    System.out.println(-release--);   }  }  public static void main(String[] args) {   final TestSyncClass syncClass new TestSyncClass();   Thread thread1 new Thread() {    Override    public void run() {     syncClass.testAdd(1);     super.run();    }   };   Thread thread2 new Thread() {    Override    public void run() {     syncClass.testAdd(2);     super.run();    }   };   Thread thread3 new Thread() {    Override    public void run() {     syncClass.testAdd(3);     super.run();    }   };   thread1.start();   thread2.start();   thread3.start();   Thread thread4 new Thread() {    Override    public void run() {     try {      Thread.sleep(2000);     } catch (InterruptedException e) {      e.printStackTrace();     }     syncClass.release();     super.run();    }   };   thread4.start();  } } 执行结果 testAdd1--- testAdd2--- testAdd3--- -release-- 3-result--3 2-result--3 1-result--3 调用object的wait(), notify()。notifyAll()法前必须获得object锁也就是这三个方法必须写在synchronized(obj) {…} 代码段内。否则跑出异常java.lang.IllegalMonitorStateException。 调用object.wait()后。线程A就释放了object的锁否则syncClass.release()无法获得object锁等待的线程。 当object.wait()方法返回后。各个线程须要再次获得object锁才干继续运行。 notify()仅仅能唤醒线程notifyAll()则能所有唤醒可是个线程须要又一次竞争object的锁。
http://www.pierceye.com/news/402818/

相关文章:

  • 长沙营销策划公司排名如何优化企业网站
  • 北京制卡厂家做卡公司北京制卡网站_北京制卡_北京 去114网wordpress 关闭注册
  • 网站建设技术优势广州天河区医院
  • python和php网站开发中国十大公司排行榜
  • 网站栅格如何建设一个外卖订餐平台网站
  • 浙江省网站建设报价群晖wordpress不成功
  • 音乐网站制作策划书网站建设公司的服务公司
  • 南昌定制网站开发多少钱手机在线网页制作
  • 无锡网站推广$做下拉去118cr高端网站建设苏州
  • 该网站未在腾讯云备案网页界面图
  • cms开源建站系统河北省建设厅管网站
  • 网站优化排名易下拉技术做官网的步骤
  • 网站备案多久服装企业 北京 网站建设
  • 网站建设(信奈辉煌电商)陕西富通建设工程有限公司网站
  • 南昌县住房和城乡建设局网站外海网站如何做网站的推广
  • 重庆网站推广报价wordpress全景图
  • 做那个的网站谁有建立什么指标体系和评价程序规范
  • 新旧网站对比全国建设厅网站
  • 有经验的番禺网站建设做球服的网站有哪些
  • 临泉建设网站互联网行业都有哪些工作
  • 甘肃省嘉峪关建设局网站做游戏交易网站
  • 校园网站做自己的广告惠州网络问政平台官网
  • 网站建设使用的什么和国外做贸易用什么网站
  • 苏州自助建站模板宁波seo快速优化
  • 做网站的可行性分析网络推广渠道公司
  • 企业网站优化兴田德润优惠汕头网络营销推广该怎么做
  • 安徽省住房和建设厅网站企业网站建设硬件
  • 网站怎样运营网站文章收录
  • 怎么制作微网站wordpress 自动安装
  • 建设软件网站七台河新闻直播