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

网站站内链接怎么做淘宝联盟网站备案

网站站内链接怎么做,淘宝联盟网站备案,建设部精神文明建设网站,网站服务器租用资质同步是什么#xff1f; 当两个线程同时对一个变量进行修改时#xff0c;不同的访问顺序会造成不一样的结果#xff0c;这时候就需要同步保证结果的唯一性。 未同步时 新建Bank类#xff0c;transfer()用于在两个账户之间转账金额 class Bank {private double[] account…同步是什么 当两个线程同时对一个变量进行修改时不同的访问顺序会造成不一样的结果这时候就需要同步保证结果的唯一性。 未同步时 新建Bank类transfer()用于在两个账户之间转账金额 class Bank {private double[] accounts;public Bank(int accountNum, double initialMoney) {accounts new double[accountNum];Arrays.fill(accounts, initialMoney);}public void transfer(int from, int to, double money) {if (accounts[from] money) {return;}System.out.print(Thread.currentThread());accounts[from] - money;System.out.printf(%10.2f from %d to %d, money, from, to);accounts[to] money;System.out.printf( Total %10.2f%n, getTotal());}public double getTotal() {double total 0.0d;for (double temp : accounts) {total temp;}return total;}public int size() {return accounts.length;} }假设银行有1000个开户人每个人账户有1000元新建1000个线程进行随机转账无论怎么转账总金额都应该为1000000但实际的钱却越来越少这个例子不太好原因是浮点数加减可能误差 int NACCOUNTS 1000; double INITIAL_BALANCE 1000; double MAX_AMOUNT 1000; int DELAY 10;Bank bank new Bank(NACCOUNTS, INITIAL_BALANCE); for (int i 0; i NACCOUNTS; i) {int fromAccount i;new Thread(new Runnable() {Overridepublic void run() {try {while (true) {int toAccount (int) (bank.size() * Math.random());double money MAX_AMOUNT * Math.random();bank.transfer(fromAccount, toAccount, money);Thread.sleep((int) (DELAY * Math.random()));}} catch (InterruptedException e) {e.printStackTrace();}}}).start(); }原因分析 当两个线程同时执行到accounts[to] money;线程1取出accounts[to]如900放到寄存器money如100正准备写回accounts[to]变成了1000时线程2抢占到权限执行accounts[to] money 将accounts[to]修改为了10002线程1再写就将10002覆盖成了1000 ReentrantLock 修改Bank对其transfer方法加锁注意lock应该为成员变量即每个Bank实例都只有一把锁不同对象之间的锁不会互相影响需要在finally释放锁 class Bank {private double[] accounts;private ReentrantLock lock new ReentrantLock();public Bank(int accountNum, double initialMoney) {accounts new double[accountNum];Arrays.fill(accounts, initialMoney);}public void transfer(int from, int to, double money) {if (accounts[from] money) {return;}lock.lock();try {System.out.print(Thread.currentThread());accounts[from] - money;System.out.printf(%10.2f from %d to %d, money, from, to);accounts[to] money;System.out.printf( Total %10.2f%n, getTotal());} finally {lock.unlock();}}public double getTotal() {double total 0.0d;for (double temp : accounts) {total temp;}return total;}public int size() {return accounts.length;} }Condition 在转账时应该避免选择没有足够资金的账号转出 if(bank.getMoney(fromAccount) money){bank.transfer(fromAccount, toAccount, money); }但在多线程情况下可能两个线程同时进入if一个线程转账后导致另外一个线程金额不够转账故我们要确保在检查之后加锁禁止别的线程先行一步 private ReentrantLock lock new ReentrantLock(); lock.lock(); try {while(account[from] money){} }finally{lock.unlock(); }但当账户没有钱的时候转出线程会一直等待其他线程转入资金而其他线程因为无法拿到锁而无法转入这就造成了死锁这时候就需要条件对象当金额不足时阻塞线程放弃锁的持有 private ReentrantLock lock new ReentrantLock(); private Condition moneyEnough;lock.lock(); try {moneyEnough lock.newCondition();while(account[from] money){moneyEnough.await();} }finally{lock.unlock(); }当其他线程转账后应该调用signalAll()唤起所有await()中的线程当其中的某个线程被调度并再次获取锁后会再进入try子句检测金额是否足够 moneyEnough.signalAll();Tips 还有一个signal()方法随机唤起一个等待线程当所有线程的金额都小于转账金额调用await()所有线程都会阻塞此时会再次死锁 synchronized Java中每一个对象都有一个内部锁如果一个方法用synchronized声明线程调用该方法时需要获得其内部锁即 public synchronized void method(){}等价于 private ReentrantLock innerLock new ReentrantLock(); public void method(){innerLock.lock();try{}finally{innerLock.unlock();} }内部锁只有一个条件对其的阻塞和唤醒调用wait()、notifyAll()/notify()它们是Object中的final方法相当对ReentrantLock调用 innerLock.await(); innerLock.signalAll();将静态方法声明为synchronized调用该方法时会锁住对应的类此时其他线程无法调用该类的其他同步静态方法 Tips 内部锁不能中断一个正在试图获得锁的线程锁时不能设置超时只有一个条件 该使用哪种锁机制? 使用synchronized可减少代码的编写减少出错的几率 使用ReentrantLockCondition可以自行控制锁的过程实现多个条件 同步阻塞 使用其他对象的锁来完成原子操作 public class bank{private Object lock new Object();public void transfer(int from, int to, double money) {synchronized(lock){}} }监视器 volatile 若如果只有一两个域可能发生多线程的误写可对该域声明为volatile虚拟机和编译器就知道该域是可能被另一个线程并发更新的但其不能保证原子性 boolean flag; public void Not(){flag !flag; }如上不能保证其再读取、翻转和写入时不被中断 final和锁 当把域声明为final时其他线程对其的读取只能是构造成功后的值而不会是null fial MapString, Double accounts new HashMap();原子性 死锁 线程局部变量 当多个线程都要调用Random中的方法生成随机数时由于Random是加锁的其他线程就得等待此时可用TheadLocal辅助类为各个线程提供各自的Random实例 ThreadLocalRandom threadLocal ThreadLocal.withInitial(() - new Random()); threadLocal.get().nextInt();此外专门创建多线程随机数的ThreadLocalRandom其current()方法会返回当前线程的Random类实例 ThreadLocalRandom.current().nextInt();锁超时 当线程调用tryLock()方法去申请另一个线程的锁时很有可能发生阻塞故可在申请时设置时长 private ReentrantLock lock new ReentrantLock(); try {lock.tryLock(100, TimeUnit.SECONDS); } catch (InterruptedException e) {e.printStackTrace(); }读写锁 读写锁可从ReentrantReadWriteLock取出为所有获取方法加上读锁为所有修改方法加上写锁 ReentrantReadWriteLock reentrantReadWriteLock new ReentrantReadWriteLock(); Lock readLock reentrantReadWriteLock.readLock(); Lock writeLock reentrantReadWriteLock.writeLock();为什么弃用stop()和suspend() stop()方法用来终止线程并立即释放线程所获得的锁这会导致对象状态不一致如钱已被转出但在转入前stop会导致数据丢失 故无法确定什么时候调用stop()是安全的在希望停止线程的时候应该中断线程被中断的线程会在安全的时候停止 suspend()方法用来阻塞线程直至另一个线程调用resume()当用suspend()挂起一个持有一个锁的线程则该锁在resume()之前是不可用的。 若此时再用suspend()方法的线程获取该锁则会死锁被挂起的锁等待resume()释放而要resume()则要获取被挂起的锁
http://www.w-s-a.com/news/707335/

相关文章:

  • 网站建设合同的验收表响应式网站建设哪家好
  • 手机网站建设视频长沙百家号seo
  • 网站未备案怎么访问网站开发前端需要学什么
  • 正黄集团博弘建设官方网站wordpress设置固定链接和伪静态
  • wordpress 建网站视频如何实现网站生成网页
  • 杭州品牌网站建设推广个人的网站建设目标
  • 济南有哪些网站是做家具团购的贸易公司自建免费网站
  • wap网站psd成立公司在什么网站
  • 网站建设婚恋交友聊城网站建设费用
  • 沈阳网站建设联系方式尉氏县金星网架公司
  • 医院网站建设实施方案基础微网站开发信息
  • 网站建设开发服务费记账百度指数搜索
  • 网站建设备案流程windows优化大师有必要安装吗
  • 怎么网站定制自己做网站卖视频
  • 网站开发二线城市网站制作过程中碰到的问题
  • 最好网站建设公司制作平台小程序开发教程资料
  • 陕西省高速建设集团公司网站国内做会展比较好的公司
  • 建设学校网站的原因网页设计实训报告1500
  • 网站建设客户来源江门网站设计华企立方
  • 自己如何做棋牌网站宁波网络推广优化方案
  • 深圳招聘网站推荐seo网站推广方案
  • 彩票网站开发 合法学术会议网站建设
  • 商务网站建设论文答辩pptseo技术博客
  • 怎样才能有自己的网站桂林搭建公司
  • 哪个网站做视频赚钱万科
  • 莆系医疗网站建设wp如何做网站地图
  • 网站建设应急处置方案团购网站 备案问题
  • 网站建设 岗位职责浙江中天建设集团有限公司网站
  • 西海岸建设局网站用wordpress建站学什么
  • 网站静态和动态学校网站建设流程步骤