Java 并发优化
线程不安全
SimpleDateFormat不是线程安全的
SimpleDateThread
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class SimpleDateThread extends Thread {
private SimpleDateFormat sdf;
private String dateString;
public SimpleDateThread(SimpleDateFormat sdf,String dateString){
this.sdf=sdf;
this.dateString=dateString;
}
public void run(){
try {
Date dateRef=sdf.parse(dateString);
String newDateString=sdf.format(dateRef).toString();
if(!newDateString.equals(dateString)){
System.out.println("ThreadName="+this.getName()+"报错了 日期字符串:"+dateString+"转换成的日期为:"+newDateString);
}else{
System.out.println("ThreadName="+this.getName()+"转换正确 日期字符串:"+dateString+"转换成的日期为:"+newDateString);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
SimpleDateDemo
import java.text.SimpleDateFormat; public class SimpleDateDemo {
public static void main(String[] args){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String[] dateStringArray=new String[]{"2000-01-01","2001-01-01","2002-01-01","2003-01-01","2004-01-01","2005-01-01","2006-01-01","2007-01-01","2008-01-01","2009-01-01"};
SimpleDateThread[] threadArray=new SimpleDateThread[10];
for(int i=0;i<10;i++){
threadArray[i]=new SimpleDateThread(sdf,dateStringArray[i]);
}
for(int i=0;i<10;i++){
threadArray[i].start();
}
}
}
运行结果
新增DateTools 类
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; public class DateTools {
public static Date parse(String formatPattern,String dateString)throws ParseException{
return new SimpleDateFormat(formatPattern).parse(dateString);
}
public static String format(String formatPattern,Date date){
return new SimpleDateFormat(formatPattern).format(date).toString();
}
}
将SimpleDateThread中的代码替换
Date dateRef=DateTools.parse("yyyy-MM-dd",dateString);
String newDateString=DateTools.format("yyyy-MM-dd",dateRef).toString();
可解决线程不安全问题。
非阻塞队列
ConcurrentLinkedQueue
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ConcurrentLinkedQueueTest {
private static ConcurrentLinkedQueue<Integer> queue=new ConcurrentLinkedQueue<Integer>();
private static int count=2;
private static CountDownLatch latch=new CountDownLatch(count); public static void main(String[] args) throws InterruptedException {
long timeStart=System.currentTimeMillis();
ExecutorService es= Executors.newFixedThreadPool(4);
ConcurrentLinkedQueueTest.offer();
for(int i=0;i<count;i++){
es.submit(new Poll());
}
latch.await();
System.out.println("cost time "+(System.currentTimeMillis()-timeStart)+"ms");
es.shutdown();
} public static void offer(){
for(int i=0;i<100000;i++){
queue.offer(i);
}
} static class Poll implements Runnable{ @Override
public void run() {
while (!queue.isEmpty()){
System.out.println(queue.poll());
}
latch.countDown();
}
}
}
阻塞队列
BlockingQueue
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque; public class BlockingQueueTest {
public class Basket{
BlockingQueue<String> basket=new LinkedBlockingDeque<>(3); public void produce() throws InterruptedException{
basket.put("An apple");
} public String consume() throws InterruptedException{
return basket.take();
}
}
public class Producer implements Runnable{
private String instance;
private Basket basket; public Producer(String instance, Basket basket) {
this.instance = instance;
this.basket = basket;
} @Override
public void run() {
try {
while (true){
System.out.println("生产者准备生产苹果: "+instance);
basket.produce();
System.out.println("!生产者生产苹果完毕: "+instance);
Thread.sleep(300);
}
} catch (InterruptedException e) {
System.out.println("Producer Interrupted");
}
}
} public class Consumer implements Runnable{
private String instance;
private Basket basket; public Consumer(String instance, Basket basket) {
this.instance = instance;
this.basket = basket;
} @Override
public void run() {
try {
while (true){
System.out.println("消费者准备消费苹果: "+instance);
System.out.println(basket.consume());
System.out.println("!消费者消费苹果完毕: "+instance);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Consumer Interrupted");
}
}
}
public static void main(String[] args){
BlockingQueueTest test=new BlockingQueueTest();
Basket basket=test.new Basket();
ExecutorService service= Executors.newCachedThreadPool();
Producer producer=test.new Producer("生产者001",basket);
Producer producer1=test.new Producer("生产者002",basket);
Consumer consumer=test.new Consumer("消费者001",basket);
service.submit(producer);
service.submit(producer1);
service.submit(consumer);
}
}
并发工具类
CyclicBarrier
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class CyclicBarrierDemo {
public static void main(String[] args) throws Exception{
CyclicBarrier barrier=new CyclicBarrier(3);
ExecutorService service= Executors.newFixedThreadPool(3);
service.submit(new Thread(new Runner(barrier, "1号选手")));
service.submit(new Thread(new Runner(barrier, "2号选手")));
service.submit(new Thread(new Runner(barrier, "3号选手")));
service.shutdown();
}
static class Runner implements Runnable{
private CyclicBarrier barrier;
private String name; public Runner(CyclicBarrier barrier, String name) {
this.barrier = barrier;
this.name = name;
} @Override
public void run() {
try {
Thread.sleep(1000*(new Random()).nextInt(8));
System.out.println(name+" 准备好了...");
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(name+" 起跑!");
}
}
}
CountDownLatch
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class CountDownLatchDemo {
private static final int PLAYER_AMOUNT=5;
public static void main(String[] args){
CountDownLatchDemo demo=new CountDownLatchDemo();
demo.exec();
} public void exec(){
CountDownLatch begin=new CountDownLatch(1);
CountDownLatch end=new CountDownLatch(PLAYER_AMOUNT);
Player[] players=new Player[PLAYER_AMOUNT];
for(int i=0;i<PLAYER_AMOUNT;i++){
players[i]=new Player(i+1,begin,end);
}
ExecutorService service= Executors.newFixedThreadPool(PLAYER_AMOUNT);
System.out.println("Race begins!");
begin.countDown();
for(Player p:players){
service.execute(p);
}
try {
end.await();
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("Race ends!");
}
service.shutdown();
}
class Player implements Runnable{
private int id;
private CountDownLatch begin;
private CountDownLatch end; public Player(int id, CountDownLatch begin, CountDownLatch end) {
this.id = id;
this.begin = begin;
this.end = end;
} @Override
public void run() {
try {
begin.await();
Thread.sleep((long)(Math.random()*100));
System.out.println("Play"+id+" arrived.");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
end.countDown();
}
}
}
}
Semaphore
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; public class SemaphoreDemo {
public static void main(String[] args){
ExecutorService service= Executors.newCachedThreadPool();
final Semaphore semaphore=new Semaphore(5);
for(int i=0;i<20;i++){
final int no=i;
Runnable runnable=new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("Accessing: "+no);
Thread.sleep((long)(Math.random()*10000));
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
Java 并发优化的更多相关文章
- 百万并发中间件系统的内核设计看Java并发性能优化
“ 这篇文章,给大家聊聊一个百万级并发的中间件系统的内核代码里的锁性能优化. 很多同学都对Java并发编程很感兴趣,学习了很多相关的技术和知识.比如volatile.Atomic.synchroniz ...
- Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...
- Java高并发秒杀API之高并发优化
---恢复内容开始--- 第1章 秒杀系统高并发优化分析 1.为什么要单独获得系统时间 访问cdn这些静态资源不用请求系统服务器 而CDN上没有系统时间,需要单独获取,获取系统时间不用优化,只是n ...
- Java 进阶7 并发优化 5 并发控制板方法
Java 进阶7 并发优化 5 并发控制板方法 20131114 前言: Java 中多线程并发程序中存在线程安全的问题,之前学习 Java的同步机制,掌握的同步方法只有一种就是使用 ...
- Java进阶7并发优化4——JDK并发数据结构
Java进阶7并发优化4——JDK并发数据结构20131114 由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以 ...
- Java进阶7 并发优化2 并行程序设计模式
Java进阶7 并发优化2 并行程序设计模式20131114 1.Master-worker模式 前面讲解了Future模式,并且使用了简单的FutureTask来实现并发中的Future模式.下面介 ...
- 【Java并发基础】使用“等待—通知”机制优化死锁中占用且等待解决方案
前言 在前篇介绍死锁的文章中,我们破坏等待占用且等待条件时,用了一个死循环来获取两个账本对象. // 一次性申请转出账户和转入账户,直到成功 while(!actr.apply(this, targe ...
- Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制
本书部分摘自<Java 并发编程的艺术> 概述 相信大家都很熟悉如何使用 Java 编写处理并发的代码,也知道 Java 代码在编译后变成 Class 字节码,字节码被类加载器加载到 JV ...
- 【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)
前言 今天学习了Java内存模型第一课的视频,讲了硬件层面的知识,还是和大学时一样,醍醐灌顶.老师讲得太好了. Java内存模型,感觉以前学得比较抽象.很繁杂,抽象. 这次试着系统一点跟着2个老师学习 ...
随机推荐
- WordPaster-UEditor1.x整合教程
版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...
- python之深浅copy
深浅copy 1.赋值运算 a = [1, 2, 3] b = a a.append(666) print(b) #output:[1, 2, 3, 666] 对于赋值运算来说,a与b指向的是同一个内 ...
- 从点到面,给Button的属性动画
属性动画是API 11加进来的一个新特性,其实在现在来说也没什么新的了.属性动画可以对任意view的属性做动画,实现动画的原理就是在给定的时间内把属性从一个值变为另一个值.因此可以说属性动画什么都可以 ...
- ESP-IDF3.0
发行版v3.0的文档可在http://esp-idf.readthedocs.io/en/v3.0/上找到. 这是自发布v3.0-rc1以来的更改列表. 如果从以前的稳定版本V2.1进行升级,请检查v ...
- PHP后台图片上传作品 接口
//把新图片添加到文件夹里 public function info($file=''){ $info = $file->validate(['ext'=>'jpg'])->rule ...
- 初始Hive
Hive 背景 引入原因 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一推MapReduce代码 对于统计任务,只能由懂MapReduce的程序员才能搞定 耗时耗力,更多精力没有有效 ...
- ajax点击加载更多图片
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- I - Dividing Stones
Description There are N stones, which can be divided into some piles arbitrarily. Let the value of e ...
- unigui在阿里云服务器上部署
unigui在阿里云服务器上部署 客户租用了阿里云WINDOWS2008服务器,部署UNIGUI发现死活不行,WINDOWS2008自带的IE9浏览器打开URL,卡死在loading...... 我远 ...
- .net framework 4.5 +steeltoe+ springcloud(三)实现Hystrix断路器
在基于.net framework的服务客户端实现断路器功能,基本项目创建步骤可以参照我的另一篇发现和调用服务的笔记,地址:http://www.cnblogs.com/troytian/p/8621 ...