摘要: 高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池? 1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换 (2)并发不高、任务执行时间长的业务要区分开看: a)假如是业务时间长 阅读全文
posted @ 2017-09-07 23:12 coder为 阅读(915) 评论(0) 推荐(0) 编辑
摘要: 1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系。在讨论Jav 阅读全文
posted @ 2017-09-07 23:00 coder为 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep(0)手动触发一次操作系统分配时间片的操作,这也是平衡CPU控制权的一种操作。 阅读全文
posted @ 2017-09-07 22:58 coder为 阅读(516) 评论(0) 推荐(0) 编辑
摘要: 抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。 阅读全文
posted @ 2017-09-07 22:57 coder为 阅读(2428) 评论(0) 推荐(0) 编辑
摘要: Thread.holdsLock(Object obj)方法,当且仅当对象obj的监视器被某条线程持有的时候才会返回true,注意这是一个static方法,这意味着"某条线程"指的是当前线程。 阅读全文
posted @ 2017-09-07 22:52 coder为 阅读(1466) 评论(0) 推荐(0) 编辑
摘要: 避免频繁地创建和销毁线程,达到线程对象的重用。另外,使用线程池还可以根据项目灵活地控制并发的数目。 阅读全文
posted @ 2017-09-07 22:51 coder为 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 简单说ThreadLocal就是一种以空间换时间的做法,在每个Thread里面维护了一个以开地址法实现的ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了 阅读全文
posted @ 2017-09-07 22:50 coder为 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 1)通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用 (2)解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系少,联系越少越可以独自发展而不需要收到相互的制约 阅读全文
posted @ 2017-09-07 22:49 coder为 阅读(1272) 评论(0) 推荐(1) 编辑
摘要: 通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAll、await/signal/signalAll进行唤起和等待,比方说阻塞队列BlockingQueue就是为线程之间共享数据而设计的 线程的通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种 阅读全文
posted @ 2017-09-07 22:48 coder为 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的。 这个问题有值得一提的地方,就是线程安全也是有几个级别的: (1)不可变 像String、Integer、Long这些,都是final类型的类,任何一个线程都改变不了它们的值,要改变除非新创建一个,因此这些 阅读全文
posted @ 2017-09-07 22:45 coder为 阅读(138) 评论(0) 推荐(0) 编辑
摘要: (1)保证可见性:多线程主要围绕可见性和原子性两个特性而展开,使用volatile关键字修饰的变量,保证了其在多线程之间的可见性,即每次读取到volatile变量,一定是最新的数据。 当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取 阅读全文
posted @ 2017-09-07 22:24 coder为 阅读(217) 评论(0) 推荐(0) 编辑
摘要: CyclicBarrier示例: 每调用一次barrier.await(), barrier的counter就减一,直到减到0,线程执行。所以CyclicBarrier的作用就是使一组线程一起到达某个点的时候同时执行。 CountDownLatch示例: 只有CountDownLatch减到0,线程 阅读全文
posted @ 2017-09-07 22:20 coder为 阅读(109) 评论(0) 推荐(0) 编辑
摘要: 我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?还记上一篇Executor框架结构中提到的Callable接口和Future接口吗?,是的,从JAVA 阅读全文
posted @ 2017-09-07 22:08 coder为 阅读(207) 评论(0) 推荐(0) 编辑
摘要: Unsafe 简单讲一下这个类。Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作。 这个类尽管里面的方法都是public的,但是并没有办法使用它们,JDK API文档也没有提供任何 阅读全文
posted @ 2017-09-07 21:50 coder为 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 1、接口和抽象类的概念是不一样的。接口是对动作的抽象,表示的是这个对象能做什么,比如人可以吃东西、狗也可以吃东西,只要有相同的行为;抽象类是对根源的抽象,表示的是这个对象是什么,比如男人是人、女人也是人 2、可以实现多个接口,只能继承一个抽象类 3、接口中只能定义抽象方法,抽象类中可以有普通方法 4 阅读全文
posted @ 2017-09-07 21:49 coder为 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类。 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功,就会生成两个完全不同的.class文件了,分别是outer.class和outer$inner.c 阅读全文
posted @ 2017-09-07 20:48 coder为 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 泛型初探 在泛型(Generic type或Generics)出现之前,是这么写代码的: 当然这是完全允许的,因为List里面的内容是Object类型的,自然任何对象类型都可以放入、都可以取出,但是这么写会有两个问题: 1、当一个对象放入集合时,集合不会记住此对象的类型,当再次从集合中取出此对象时, 阅读全文
posted @ 2017-09-07 20:15 coder为 阅读(130) 评论(0) 推荐(0) 编辑
摘要: http://www.cnblogs.com/xrq730/p/4869065.html 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型。举个例子: 这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱。再看另外一段代码: 这个过程中会根据包装器类型自动将数据 阅读全文
posted @ 2017-09-07 19:54 coder为 阅读(857) 评论(0) 推荐(0) 编辑
摘要: 转载自:http://www.cnblogs.com/xrq730/p/4868465.html 以前对foreach循环就是这么用着,触动我去研究foreach循环的原理的原因是大概两个月前,自己写了一个ArrayList,想用foreach循环遍历一下看一下写的效果,结果报了空指针异常。本文就写 阅读全文
posted @ 2017-09-07 19:49 coder为 阅读(748) 评论(0) 推荐(0) 编辑
摘要: 可变长度参数 先讲可变长度参数,看一段代码: print方法的参数的意思是表示传入的String个数是不定的,看一下代码的运行结果: 我用数组遍历的方式成功地将输入的参数遍历出来了,这说明两个问题: 1、可以使用遍历数组的方式去遍历可变参数 2、可变参数是利用数组实现的 既然这样,那我其实main函 阅读全文
posted @ 2017-09-07 19:45 coder为 阅读(428) 评论(0) 推荐(0) 编辑