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

怎么做查询数据输入的网站什么是网站推广优化

怎么做查询数据输入的网站,什么是网站推广优化,wordpress容器,宣传策划方案模板引如果对什么是线程、什么是进程仍存有疑惑#xff0c;请先Google之#xff0c;因为这两个概念不在本文的范围之内。用多线程只有一个目的#xff0c;那就是更好的利用cpu的资源#xff0c;因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对#xff0c;因…引如果对什么是线程、什么是进程仍存有疑惑请先Google之因为这两个概念不在本文的范围之内。用多线程只有一个目的那就是更好的利用cpu的资源因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对因为反应“多角色”的程序代码最起码每个角色要给他一个线程吧否则连实际场景都无法模拟当然也没法说能用单线程来实现比如最常见的“生产者消费者模型”。很多人都对其中的一些概念不够明确如同步、并发等等让我们先建立一个数据字典以免产生误会。多线程指的是这个程序一个进程运行时产生了不止一个线程并行与并发并行多个cpu实例或者多台机器同时执行一段处理逻辑是真正的同时。并发通过cpu调度算法让用户看上去同时执行实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源那么针对这个公用的资源往往产生瓶颈我们会用TPS或者QPS来反应这个系统的处理能力。并发与并行线程安全经常用来描绘一段代码。指在并发的情况之下该代码经过多线程使用线程的调度顺序不影响任何结果。这个时候使用多线程我们只需要关注系统的内存cpu是不是够用即可。反过来线程不安全就意味着线程的调度顺序会影响最终结果如不加事务的转账代码void transferMoney(User from, User to, float amount){ to.setMoney(to.getBalance() amount); from.setMoney(from.getBalance() - amount); }同步Java中的同步指的是通过人为的控制和调度保证共享资源的多线程访问成为线程安全来保证结果的准确。如上面的代码简单加入synchronized关键字。在保证结果准确的同时提高性能才是优秀的程序。线程安全的优先级高于性能。好了让我们开始吧。我准备分成几部分来总结涉及到多线程的内容扎好马步线程的状态内功心法每个对象都有的方法机制太祖长拳基本线程类九阴真经高级多线程控制类扎好马步线程的状态先来两张图线程状态线程状态转换各种状态一目了然值得一提的是blocked这个状态线程在Running的过程中可能会遇到阻塞(Blocked)情况调用join()和sleep()方法sleep()时间结束或被打断join()中断,IO完成都会回到Runnable状态等待JVM的调度。调用wait()使该线程处于等待池(wait blocked pool),直到notify()/notifyAll()线程被唤醒被放到锁定池(lock blocked pool )释放同步锁使线程回到可运行状态Runnable对Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。此外在runnable状态的线程是处于被调度的线程此时的调度顺序是不一定的。Thread类中的yield方法可以让一个running状态的线程转入runnable。内功心法每个对象都有的方法机制synchronized, wait, notify 是任何对象都具有的同步工具。让我们先来了解他们monitor他们是应用于同步问题的人工线程调度工具。讲其本质首先就要明确monitor的概念Java中的每个对象都有一个监视器来监测并发代码的重入。在非多线程编码时该监视器不发挥作用反之如果在synchronized 范围内监视器发挥作用。wait/notify必须存在于synchronized块中。并且这三个关键字针对的是同一个监视器某对象的监视器。这意味着wait之后其他线程可以进入同步块执行。当某代码并不持有监视器的使用权时如图中5的状态即脱离同步块去wait或notify会抛出java.lang.IllegalMonitorStateException。也包括在synchronized块中去调用另一个对象的wait/notify因为不同对象的监视器不同同样会抛出此异常。再讲用法synchronized单独使用代码块如下在多线程环境下synchronized块中的方法获取了lock实例的monitor如果实例相同那么只有一个线程能执行该块内容public class Thread1 implements Runnable { Object lock; public void run() { synchronized(lock){ ..do something } } }直接用于方法 相当于上面代码中用lock来锁定的效果实际获取的是Thread1类的monitor。更进一步如果修饰的是static方法则锁定该类所有实例。public class Thread1 implements Runnable { public synchronized void run() { ..do something } }synchronized, wait, notify结合:典型场景生产者消费者问题/** * 生产者生产出来的产品交给店员 */ public synchronized void produce() { if(this.product MAX_PRODUCT) { try { wait(); System.out.println(产品已满,请稍候再生产); } catch(InterruptedException e) { e.printStackTrace(); } return; } this.product; System.out.println(生产者生产第 this.product 个产品.); notifyAll(); //通知等待区的消费者可以取出产品了 } /** * 消费者从店员取产品 */ public synchronized void consume() { if(this.product MIN_PRODUCT) { try { wait(); System.out.println(缺货,稍候再取); } catch (InterruptedException e) { e.printStackTrace(); } return; } System.out.println(消费者取走了第 this.product 个产品.); this.product--; notifyAll(); //通知等待去的生产者可以生产产品了 }volatile多线程的内存模型main memory主存、working memory线程栈在处理数据时线程会把值从主存load到本地栈完成操作后再save回去(volatile关键词的作用每次针对该变量的操作都激发一次load and save)。volatile针对多线程使用的变量如果不是volatile或者final修饰的很有可能产生不可预知的结果另一个线程修改了这个值但是之后在某线程看到的是修改之前的值。其实道理上讲同一实例的同一属性本身只有一个副本。但是多线程是会缓存值的本质上volatile就是不去缓存直接取值。在线程安全的情况下加volatile会牺牲性能。太祖长拳基本线程类基本线程类指的是Thread类Runnable接口Callable接口Thread 类实现了Runnable接口启动一个线程的方法MyThread my new MyThread();my.start();Thread类相关方法//当前线程可转让cpu控制权让别的就绪状态线程运行切换 public static Thread.yield() //暂停一段时间 public static Thread.sleep() //在一个线程中调用other.join(),将等待other执行完后才继续本线程。     public join() //后两个函数皆可以被打断 public interrupte()关于中断它并不像stop方法那样会中断一个正在运行的线程。线程会不时地检测中断标识位以判断线程是否应该被中断中断标识值是否为true。终端只会影响到wait状态、sleep状态和join状态。被打断的线程会抛出InterruptedException。Thread.interrupted()检查当前线程是否发生中断返回booleansynchronized在获锁的过程中是不能被中断的。中断是一个状态interrupt()方法只是将这个状态置为true而已。所以说正常运行的程序不去检测状态就不会终止而wait等阻塞方法会去检查并抛出异常。如果在正常运行的程序中添加while(!Thread.interrupted()) 则同样可以在中断后离开代码体Thread类最佳实践写的时候最好要设置线程名称 Thread.name并设置线程组 ThreadGroup目的是方便管理。在出现问题的时候打印线程栈 (jstack -pid) 一眼就可以看出是哪个线程出的问题这个线程是干什么的。如何获取线程中的异常不能用try,catch来获取线程中的异常Runnable与Thread类似Callablefuture模式并发模式的一种可以有两种形式即无阻塞和阻塞分别是isDone和get。其中Future对象用来存放该线程的返回值以及状态ExecutorService e Executors.newFixedThreadPool(3);//submit方法有多重参数版本及支持callable也能够支持runnable接口类型. Future future e.submit(new myCallable()); future.isDone() //return true,false 无阻塞 future.get() // return 返回值阻塞直到该线程运行结束九阴真经高级多线程控制类以上都属于内功心法接下来是实际项目中常用到的工具了Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。1.ThreadLocal类用处保存线程的独立变量。对一个线程类继承自Thread)当使用ThreadLocal维护变量时ThreadLocal为每个使用该变量的线程提供独立的变量副本所以每一个线程都可以独立地改变自己的副本而不会影响其它线程所对应的副本。常用于用户登录控制如记录session信息。实现每个Thread都持有一个TreadLocalMap类型的变量该类是一个轻量级的Map功能与map一样区别是桶里放的是entry而不是entry的链表。功能还是一个map。以本身为key以目标为value。主要方法是get()和set(T a)set之后在map里维护一个threadLocal - aget时将a返回。ThreadLocal是一个特殊的容器。2.原子类AtomicInteger、AtomicBoolean……如果使用atomic wrapper class如atomicInteger或者使用自己保证原子的操作则等同于synchronized//返回值为boolean AtomicInteger.compareAndSet(int expect,int update)该方法可用于实现乐观锁考虑文中最初提到的如下场景a给b付款10元a扣了10元b要加10元。此时c给b2元但是b的加十元代码约为if(b.value.compareAndSet(old, value)){return ; }else{//try again// if that fails, rollback and log }AtomicReference对于AtomicReference 来讲也许对象会出现属性丢失的情况即oldObject current但是oldObject.getPropertyA ! current.getPropertyA。这时候AtomicStampedReference就派上用场了。这也是一个很常用的思路即加上版本号3.Lock类 lock: 在java.util.concurrent包内。共有三个实现ReentrantLockReentrantReadWriteLock.ReadLockReentrantReadWriteLock.WriteLock主要目的是和synchronized一样 两者都是为了解决同步问题处理资源争端而产生的技术。功能类似但有一些区别。区别如下lock更灵活可以自由定义多把锁的枷锁解锁顺序synchronized要按照先加的后解顺序提供多种加锁方案lock 阻塞式, trylock 无阻塞式, lockInterruptily 可打断式 还有trylock的带超时时间版本。本质上和监视器锁即synchronized是一样的能力越大责任越大必须控制好加锁和解锁否则会导致灾难。和Condition类的结合。性能更高对比如下图synchronized和Lock性能对比ReentrantLock 可重入的意义在于持有锁的线程可以继续持有并且要释放对等的次数后才真正释放该锁。使用方法是1.先new一个实例static ReentrantLock rnew ReentrantLock();2.加锁      r.lock()或r.lockInterruptibly();此处也是个不同后者可被打断。当a线程lock后b线程阻塞此时如果是lockInterruptibly那么在调用b.interrupt()之后b线程退出阻塞并放弃对资源的争抢进入catch块。如果使用后者必须throw interruptable exception 或catch    3.释放锁   r.unlock()必须做何为必须做呢要放在finally里面。以防止异常跳出了正常流程导致灾难。这里补充一个小知识点finally是可以信任的经过测试哪怕是发生了OutofMemoryErrorfinally块中的语句执行也能够得到保证。ReentrantReadWriteLock可重入读写锁读写锁的一个实现ReentrantReadWriteLock lock new ReentrantReadWriteLock()ReadLock r lock.readLock();WriteLock w lock.writeLock();两者都有lock,unlock方法。写写写读互斥读读不互斥。可以实现并发读的高效线程安全代码4.容器类这里就讨论比较常用的两个BlockingQueueConcurrentHashMapBlockingQueue阻塞队列。该类是java.util.concurrent包下的重要类通过对Queue的学习可以得知这个queue是单向队列可以在队列头添加元素和在队尾删除或取出元素。类似于一个管  道特别适用于先进先出策略的一些应用场景。普通的queue接口主要实现有PriorityQueue优先队列有兴趣可以研究BlockingQueue在队列的基础上添加了多线程协作的功能BlockingQueue除了传统的queue功能表格左边的两列之外还提供了阻塞接口put和take带超时功能的阻塞接口offer和poll。put会在队列满的时候阻塞直到有空间时被唤醒take在队 列空的时候阻塞直到有东西拿的时候才被唤醒。用于生产者-消费者模型尤其好用堪称神器。常见的阻塞队列有ArrayListBlockingQueueLinkedListBlockingQueueDelayQueueSynchronousQueueConcurrentHashMap高效的线程安全哈希map。请对比hashTable , concurrentHashMap, HashMap5.管理类管理类的概念比较泛用于管理线程本身不是多线程的但提供了一些机制来利用上述的工具做一些封装。了解到的值得一提的管理类ThreadPoolExecutor和 JMX框架下的系统级管理类 ThreadMXBeanThreadPoolExecutor如果不了解这个类应该了解前面提到的ExecutorService开一个自己的线程池非常方便ExecutorService e Executors.newCachedThreadPool();ExecutorService e Executors.newSingleThreadExecutor();ExecutorService e Executors.newFixedThreadPool(3);// 第一种是可变大小线程池按照任务数来分配线程// 第二种是单线程池相当于FixedThreadPool(1)// 第三种是固定大小线程池。// 然后运行e.execute(new MyRunnableImpl());该类内部是通过ThreadPoolExecutor实现的掌握该类有助于理解线程池的管理本质上他们都是ThreadPoolExecutor类的各种实现版本。请参见javadocThreadPoolExecutor参数解释翻译一下corePoolSize:池内线程初始值与最小值就算是空闲状态也会保持该数量线程。maximumPoolSize:线程最大值线程的增长始终不会超过该值。keepAliveTime当池内线程数高于corePoolSize时经过多少时间多余的空闲线程才会被回收。回收前处于wait状态unit时间单位可以使用TimeUnit的实例如TimeUnit.MILLISECONDS workQueue:待入任务Runnable的等待场所该参数主要影响调度策略如公平与否是否产生饿死(starving)threadFactory:线程工厂类有默认实现如果有自定义的需要则需要自己实现ThreadFactory接口并作为参数传入。
http://wiki.neutronadmin.com/news/72678/

相关文章:

  • 做面食网站优化网站搜索
  • 建设门户网站价格兰州网站开发公司
  • 选择网站建设公司应该注意什么网站板块设计有哪些
  • 个人做房产网站小程序app开发多少钱
  • 网站广告条怎么做wordpress登录地址加密
  • 食品行业网站开发怎么制作网站?
  • 网站优化推广服务网站如何调用百度地图
  • 如何构建网站平台数学网站怎么做
  • phpwind网站公司网站开发费算什么费用
  • 十大网站建设排名四川省城乡住房建设厅网站
  • 安阳河南网站建设注册网页代码
  • 网站建设毕业答辩ppt怎么写有没有做网站源代码修改的
  • 网站 被黑wordpress空间安装教程
  • 海南省城乡建设部网站首页怎么用linux做网站服务器
  • 网站建设视频代码wordpress安装图片不显示
  • 网站登录界面模板html龙岩
  • 有哪些可以做策划方案的网站怎么让网站绑定域名
  • 网站用什么服务器wordpress 文章主题图
  • 做网站的那些个人工作室公司网站建设需要注意事项
  • 企业建设网站价格网站优化总结报告
  • 有那些网站可以做推广紫色 网站
  • 淘宝网站建设评价表什么网站有教做变蛋的
  • 网站开发程序有哪些常熟市维摩剑门绿茶网站建设目标
  • 零基础学pytho 网站开发购物网站建设多少钱
  • 网页制作与网站建设完全学习手册下载网站做哪些比较有意思
  • 商丘网站建设公司网站建设对接模版
  • vue做的网站有什么搜索数据
  • 南京做网站具体需要多少钱桐城市美好乡村建设办公室网站
  • wordpress 建站后端大同百度做网站多少钱
  • 公司网站建设项目的成本计划管理员修改网站的参数会对网站的搜效果产生什么影响?