线程不安全

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 并发优化的更多相关文章

  1. 百万并发中间件系统的内核设计看Java并发性能优化

    “ 这篇文章,给大家聊聊一个百万级并发的中间件系统的内核代码里的锁性能优化. 很多同学都对Java并发编程很感兴趣,学习了很多相关的技术和知识.比如volatile.Atomic.synchroniz ...

  2. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  3. Java高并发秒杀API之高并发优化

    ---恢复内容开始--- 第1章 秒杀系统高并发优化分析   1.为什么要单独获得系统时间 访问cdn这些静态资源不用请求系统服务器 而CDN上没有系统时间,需要单独获取,获取系统时间不用优化,只是n ...

  4. Java 进阶7 并发优化 5 并发控制板方法

    Java 进阶7 并发优化 5 并发控制板方法 20131114 前言:          Java 中多线程并发程序中存在线程安全的问题,之前学习 Java的同步机制,掌握的同步方法只有一种就是使用 ...

  5. Java进阶7并发优化4——JDK并发数据结构

    Java进阶7并发优化4——JDK并发数据结构20131114 由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以 ...

  6. Java进阶7 并发优化2 并行程序设计模式

    Java进阶7 并发优化2 并行程序设计模式20131114 1.Master-worker模式 前面讲解了Future模式,并且使用了简单的FutureTask来实现并发中的Future模式.下面介 ...

  7. 【Java并发基础】使用“等待—通知”机制优化死锁中占用且等待解决方案

    前言 在前篇介绍死锁的文章中,我们破坏等待占用且等待条件时,用了一个死循环来获取两个账本对象. // 一次性申请转出账户和转入账户,直到成功 while(!actr.apply(this, targe ...

  8. Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制

    本书部分摘自<Java 并发编程的艺术> 概述 相信大家都很熟悉如何使用 Java 编写处理并发的代码,也知道 Java 代码在编译后变成 Class 字节码,字节码被类加载器加载到 JV ...

  9. 【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)

    前言 今天学习了Java内存模型第一课的视频,讲了硬件层面的知识,还是和大学时一样,醍醐灌顶.老师讲得太好了. Java内存模型,感觉以前学得比较抽象.很繁杂,抽象. 这次试着系统一点跟着2个老师学习 ...

随机推荐

  1. arguments[0]()的详解

    var length = 10; function fn(){ console.log(this.length); } var obj = { length:5, method:function(fn ...

  2. Nodejs入门【转载】保留备用

    关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版. ...

  3. C++编译器详解(三)函数调用的区别:_cdecl以及_stdcall

    1._stdcall是Pascal程序的缺省调用方式,通常用于Win32 API中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上&qu ...

  4. 【ORA错误大全】 ORA-19527

    在做主备切换的时候,需要将备库的联机日志文件清除(clear online redo logfile),为了加快switchover的速度,Oracle10g在将备库置于manged standby状 ...

  5. hibernate检索策略(抓取策略)

    检索策略 类级别检索 默认检索策略:默认延迟加载, 可以使用lazy属性来进行改变. session.get(clazz,object)默认立即加载 @Test //测试左外连接查询 public v ...

  6. css的三种使用方式:行内样式,内嵌样式,外部引用样式

    三中的使用方法的简单实例如下: 行内样式: <!doctype html> <html> <head> <meta charset="UTF-8&q ...

  7. hdu 1695 GCD 【莫比乌斯函数】

    题目大意:给你 a , b , c , d , k 五个值 (题目说明了 你可以认为 a=c=1)  x 属于 [1,b] ,y属于[1,d]  让你求有多少对这样的 (x,y)满足gcd(x,y)= ...

  8. delphi CopyFileProgressBar 拷贝文件显示进度条

    CopyFileProgressBar(pwidechar(ListBox1.Items.Strings[I]),pwidechar(NewDir+'\'+ExtractFileName(ListBo ...

  9. wpf 水波进度条 用户控件

    之前看公司web前端做了个 圆形的水波纹 进度条,就想用wpf 做一个,奈何自己太菜 一直做不出来,在看过 “普通的地球人” 的 “ WPF实现三星手机充电界面 博客之后 我也来照葫芦画个瓢. 废话不 ...

  10. C# 使用Google Protocol Buffers

    Google Protocol Buffers 使用3.0版本 下载protoc.exe 下载链接 https://github.com/protocolbuffers/protobuf/releas ...