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

查询网站备案名3d模型资源哪个网站比较好

查询网站备案名,3d模型资源哪个网站比较好,我要建立网站,国内最好的seo培训本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题。一.一个典型的Java线程安全例子1 public classThreadTest {23 public static voidmain(String[] args) {4 Account account new Account(123456, 1000);5 DrawMoneyRunnable drawMoneyRunnable …本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题。一.一个典型的Java线程安全例子1 public classThreadTest {23 public static voidmain(String[] args) {4 Account account new Account(123456, 1000);5 DrawMoneyRunnable drawMoneyRunnable new DrawMoneyRunnable(account, 700);6 Thread myThread1 newThread(drawMoneyRunnable);7 Thread myThread2 newThread(drawMoneyRunnable);8 myThread1.start();9 myThread2.start();10 }1112 }1314 class DrawMoneyRunnable implementsRunnable {1516 privateAccount account;17 private doubledrawAmount;1819 public DrawMoneyRunnable(Account account, doubledrawAmount) {20 super();21 this.account account;22 this.drawAmount drawAmount;23 }2425 public voidrun() {26 if (account.getBalance() drawAmount) { //127 System.out.println(取钱成功 取出钱数为 drawAmount);28 double balance account.getBalance() -drawAmount;29 account.setBalance(balance);30 System.out.println(余额为 balance);31 }32 }33 }3435 classAccount {3637 privateString accountNo;38 private doublebalance;3940 publicAccount() {4142 }4344 public Account(String accountNo, doublebalance) {45 this.accountNo accountNo;46 this.balance balance;47 }4849 publicString getAccountNo() {50 returnaccountNo;51 }5253 public voidsetAccountNo(String accountNo) {54 this.accountNo accountNo;55 }5657 public doublegetBalance() {58 returnbalance;59 }6061 public void setBalance(doublebalance) {62 this.balance balance;63 }6465 }上面例子很容易理解有一张银行卡里面有1000的余额程序模拟你和你老婆同时在取款机进行取钱操作的场景。多次运行此程序可能具有多个不同组合的输出结果。其中一种可能的输出为1 取钱成功 取出钱数为700.02 余额为300.03 取钱成功 取出钱数为700.04 余额为-400.0也就是说对于一张只有1000余额的银行卡你们一共可以取出1400这显然是有问题的。经过分析问题在于Java多线程环境下的执行的不确定性。CPU可能随机的在多个处于就绪状态中的线程中进行切换因此很有可能出现如下情况当thread1执行到//1处代码时判断条件为true此时CPU切换到thread2执行//1处代码发现依然为真然后执行完thread2接着切换到thread1接着执行完毕。此时就会出现上述结果。因此讲到线程安全问题其实是指多线程环境下对共享资源的访问可能会引起此共享资源的不一致性。因此为避免线程安全问题应该避免多线程环境下对此共享资源的并发访问。二.同步方法对共享资源进行访问的方法定义中加上synchronized关键字修饰使得此方法称为同步方法。可以简单理解成对此方法进行了加锁其锁对象为当前方法所在的对象自身。多线程环境下当执行此方法时首先都要获得此同步锁(且同时最多只有一个线程能够获得)只有当线程执行完此同步方法后才会释放锁对象其他的线程才有可能获取此同步锁以此类推...在上例中共享资源为account对象当使用同步方法时可以解决线程安全问题。只需在run()方法前加上synshronized关键字即可。1 public synchronized voidrun() {23 //....45 }三.同步代码块正如上面所分析的那样解决线程安全问题其实只需限制对共享资源访问的不确定性即可。使用同步方法时使得整个方法体都成为了同步执行状态会使得可能出现同步范围过大的情况于是针对需要同步的代码可以直接另一种同步方式——同步代码块来解决。同步代码块的格式为1 synchronized(obj) {23 //...45 }其中obj为锁对象因此选择哪一个对象作为锁是至关重要的。一般情况下都是选择此共享资源对象作为锁对象。如上例中最好选用account对象作为锁对象。(当然选用this也是可以的那是因为创建线程使用了runnable方式如果是直接继承Thread方式创建的线程使用this对象作为同步锁会其实没有起到任何作用因为是不同的对象了。因此选择同步锁时需要格外小心...)四.Lock对象同步锁上面我们可以看出正因为对同步锁对象的选择需要如此小心有没有什么简单点的解决方案呢以方便同步锁对象与共享资源解耦同时又能很好的解决线程安全问题。使用Lock对象同步锁可以方便的解决此问题唯一需要注意的一点是Lock对象需要与资源对象同样具有一对一的关系。Lock对象同步锁一般格式为1 classX {23 //显示定义Lock同步锁对象此对象与共享资源具有一对一关系4 private final Lock lock newReentrantLock();56 public voidm(){7 //加锁8 lock.lock();910 //... 需要进行线程安全同步的代码1112 //释放Lock锁13 lock.unlock();14 }1516 }五.wait()/notify()/notifyAll()线程通信在博文《Java总结篇系列java.lang.Object》中有提及到这三个方法虽然这三个方法主要都是用于多线程中但实际上都是Object类中的本地方法。因此理论上任何Object对象都可以作为这三个方法的主调在实际的多线程编程中只有同步锁对象调这三个方法才能完成对多线程间的线程通信。wait()导致当前线程等待并使其进入到等待阻塞状态。直到其他线程调用该同步锁对象的notify()或notifyAll()方法来唤醒此线程。notify()唤醒在此同步锁对象上等待的单个线程如果有多个线程都在此同步锁对象上等待则会任意选择其中某个线程进行唤醒操作只有当前线程放弃对同步锁对象的锁定才可能执行被唤醒的线程。notifyAll()唤醒在此同步锁对象上等待的所有线程只有当前线程放弃对同步锁对象的锁定才可能执行被唤醒的线程。1 packagecom.qqyumidi;23 public classThreadTest {45 public static voidmain(String[] args) {6 Account account new Account(123456, 0);78 Thread drawMoneyThread new DrawMoneyThread(取钱线程, account, 700);9 Thread depositeMoneyThread new DepositeMoneyThread(存钱线程, account, 700);1011 drawMoneyThread.start();12 depositeMoneyThread.start();13 }1415 }1617 class DrawMoneyThread extendsThread {1819 privateAccount account;20 private doubleamount;2122 public DrawMoneyThread(String threadName, Account account, doubleamount) {23 super(threadName);24 this.account account;25 this.amount amount;26 }2728 public voidrun() {29 for (int i 0; i 100; i) {30 account.draw(amount, i);31 }32 }33 }3435 class DepositeMoneyThread extendsThread {3637 privateAccount account;38 private doubleamount;3940 public DepositeMoneyThread(String threadName, Account account, doubleamount) {41 super(threadName);42 this.account account;43 this.amount amount;44 }4546 public voidrun() {47 for (int i 0; i 100; i) {48 account.deposite(amount, i);49 }50 }51 }5253 classAccount {5455 privateString accountNo;56 private doublebalance;57 //标识账户中是否已有存款58 private boolean flag false;5960 publicAccount() {6162 }6364 public Account(String accountNo, doublebalance) {65 this.accountNo accountNo;66 this.balance balance;67 }6869 publicString getAccountNo() {70 returnaccountNo;71 }7273 public voidsetAccountNo(String accountNo) {74 this.accountNo accountNo;75 }7677 public doublegetBalance() {78 returnbalance;79 }8081 public void setBalance(doublebalance) {82 this.balance balance;83 }8485 /**86 * 存钱87 *88 *paramdepositeAmount89 */90 public synchronized void deposite(double depositeAmount, inti) {9192 if(flag) {93 //账户中已有人存钱进去此时当前线程需要等待阻塞94 try{95 System.out.println(Thread.currentThread().getName() 开始要执行wait操作 -- i i);96 wait();97 //198 System.out.println(Thread.currentThread().getName() 执行了wait操作 -- i i);99 } catch(InterruptedException e) {100 e.printStackTrace();101 }102 } else{103 //开始存钱104 System.out.println(Thread.currentThread().getName() 存款: depositeAmount -- i i);105 setBalance(balance depositeAmount);106 flag true;107108 //唤醒其他线程109 notifyAll();110111 //2112 try{113 Thread.sleep(3000);114 } catch(InterruptedException e) {115 e.printStackTrace();116 }117 System.out.println(Thread.currentThread().getName() -- 存钱 -- 执行完毕 -- i i);118 }119 }120121 /**122 * 取钱123 *124 *paramdrawAmount125 */126 public synchronized void draw(double drawAmount, inti) {127 if (!flag) {128 //账户中还没人存钱进去此时当前线程需要等待阻塞129 try{130 System.out.println(Thread.currentThread().getName() 开始要执行wait操作 执行了wait操作 -- i i);131 wait();132 System.out.println(Thread.currentThread().getName() 执行了wait操作 执行了wait操作 -- i i);133 } catch(InterruptedException e) {134 e.printStackTrace();135 }136 } else{137 //开始取钱138 System.out.println(Thread.currentThread().getName() 取钱 drawAmount -- i i);139 setBalance(getBalance() -drawAmount);140141 flag false;142143 //唤醒其他线程144 notifyAll();145146 System.out.println(Thread.currentThread().getName() -- 取钱 -- 执行完毕 -- i i); //3147 }148 }149150 }上面的例子演示了wait()/notify()/notifyAll()的用法。部分输出结果为1 取钱线程 开始要执行wait操作 执行了wait操作 -- i02 存钱线程 存款:700.0 -- i03 存钱线程-- 存钱 -- 执行完毕 -- i04 存钱线程 开始要执行wait操作 -- i15 取钱线程 执行了wait操作 执行了wait操作 -- i06 取钱线程 取钱700.0 -- i17 取钱线程-- 取钱 -- 执行完毕 -- i18 取钱线程 开始要执行wait操作 执行了wait操作 -- i29 存钱线程 执行了wait操作 -- i110 存钱线程 存款:700.0 -- i211 存钱线程-- 存钱 -- 执行完毕 -- i212 取钱线程 执行了wait操作 执行了wait操作 -- i213 取钱线程 取钱700.0 -- i314 取钱线程-- 取钱 -- 执行完毕 -- i315 取钱线程 开始要执行wait操作 执行了wait操作 -- i416 存钱线程 存款:700.0 -- i317 存钱线程-- 存钱 -- 执行完毕 -- i318 存钱线程 开始要执行wait操作 -- i419 取钱线程 执行了wait操作 执行了wait操作 -- i420 取钱线程 取钱700.0 -- i521 取钱线程-- 取钱 -- 执行完毕 -- i522 取钱线程 开始要执行wait操作 执行了wait操作 -- i623 存钱线程 执行了wait操作 -- i424 存钱线程 存款:700.0 -- i525 存钱线程-- 存钱 -- 执行完毕 -- i526 存钱线程 开始要执行wait操作 -- i627 取钱线程 执行了wait操作 执行了wait操作 -- i628 取钱线程 取钱700.0 -- i729 取钱线程-- 取钱 -- 执行完毕 -- i730 取钱线程 开始要执行wait操作 执行了wait操作 -- i831 存钱线程 执行了wait操作 -- i632 存钱线程 存款:700.0 -- i7由此我们需要注意如下几点1.wait()方法执行后当前线程立即进入到等待阻塞状态其后面的代码不会执行2.notify()/notifyAll()方法执行后将唤醒此同步锁对象上的(任意一个-notify()/所有-notifyAll())线程对象但是此时还并没有释放同步锁对象也就是说如果notify()/notifyAll()后面还有代码还会继续进行知道当前线程执行完毕才会释放同步锁对象3.notify()/notifyAll()执行后如果右面有sleep()方法则会使当前线程进入到阻塞状态但是同步对象锁没有释放依然自己保留那么一定时候后还是会继续执行此线程接下来同24.wait()/notify()/nitifyAll()完成线程间的通信或协作都是基于不同对象锁的因此如果是不同的同步对象锁将失去意义同时同步对象锁最好是与共享资源对象保持一一对应关系5.当wait线程唤醒后并执行时是接着上次执行到的wait()方法代码后面继续往下执行的。当然上面的例子相对来说比较简单只是为了简单示例wait()/notify()/noitifyAll()方法的用法但其本质上说已经是一个简单的生产者-消费者模式了。
http://www.yutouwan.com/news/381365/

相关文章:

  • 做翻译小说网站赚钱吗家庭局域网设计方案
  • 建影楼网站多少钱定制开发小程序和模板小程序
  • 网站制作教程下载免费那个网站
  • 电商网站 技术搭建 wordpress 简书
  • 中铁建设投资集团有限公司招聘网站百度爱采购竞价推广
  • 嘉兴响应式网站云南机场建设集团网站
  • 做sgs认证的公司网站直播是网站怎么做
  • 湖北网站开发培训千锋培训机构官网
  • 网站开发课题开发背景主流建站开源程序有哪些
  • 如何将自己做的网站放到网上wordpress媒体库无法显示
  • 学校网站网页建设开题报告书网站建设需要具备的能力
  • 深圳网站制作要多少钱做网站公司多少钱
  • 页面设计制作网站源码莱西网站制作联赛与超
  • 网站宣传推广平台asp做的网站怎么运行
  • 个人网站备案 网站服务内容英文网站建设费用
  • 宁波本地网站排行意派h5制作平台
  • 配送网站开发景德镇网站制作公司
  • 找个美工做淘宝网站需要多少钱网站建设与运营课程
  • 手机网站横幅制作模板wordpress做分类信息网站
  • 商务网站建设流程步骤阿里云商业网站建设视频
  • 免费企业电话名录手机优化系统
  • 网站同时做竞价和seowordpress撤销更改
  • 租赁空间网站建设建设网站过程中
  • 推广型网站建设销售吉林省交通建设集团有限公司网站
  • 夏天做啥网站致富免费下载微信并安装
  • 网络营销发展的新趋势东莞百度推广优化
  • 怎样优化排名自己网站枣庄网站建设哪家公司好
  • 网站运营有前途吗wordpress 获取文章列表
  • 福州网站建设市场搜索引擎下载入口
  • 站内营销推广方案软件商店安装下载