1、java中的四种引用类型(级别由高到低为:强引用,软引用,弱引用和虚引用)

  1.1 强引用:默认创建的变量都是强引用,垃圾回收机制不会将其回收,当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止

  1.2 软引用(SoftReference):内存不足时,垃圾回收器就会回收它

  1.3 弱引用(WeakReference):只要进行垃圾回收,就会把其回收

  1.4 虚引用(PhantomReference):在任何时候都 可能被回收

//引用队列
ReferenceQueue<ReferenceObject> referenceQueue = new ReferenceQueue<ReferenceObject>();
//强引用
ReferenceObject referenceObject=new ReferenceObject("强引用");
//软引用
SoftReference<ReferenceObject> softReference=new SoftReference<ReferenceObject>(new ReferenceObject("软引用"));
//弱引用
WeakReference<ReferenceObject> weakReference=new WeakReference<ReferenceObject>(new ReferenceObject("弱引用"),referenceQueue);
//虚引用
PhantomReference<ReferenceObject> phantomReference=new PhantomReference<ReferenceObject>(new ReferenceObject("虚引用"), referenceQueue);
System.out.println("强引用:"+referenceObject);//强引用:ReferenceObject [name=强引用]
System.out.println("软引用:"+softReference.get());//软引用:ReferenceObject [name=软引用]
System.out.println("弱引用:"+weakReference.get());//弱引用:ReferenceObject [name=弱引用]
System.out.println("虚引用:"+phantomReference.get());//虚引用:null System.gc();//虚引用被回收了 弱引用被回收了
System.out.println("========gc==========");
System.out.println("强引用:"+referenceObject);//强引用:ReferenceObject [name=强引用]
System.out.println("软引用:"+softReference.get());//软引用:ReferenceObject [name=软引用]
System.out.println("弱引用:"+weakReference.get());//弱引用:null
System.out.println("虚引用:"+phantomReference.get());//虚引用:null System.out.println("========内存不知时gc==========");
byte[] bigByte=new byte[2015*1250*590];//软引用被回收了

2、future模式

  核心思想:通过开启子线程来代替主线程处理比较耗时的操作,子线程处理完后通知主线程来获取数据

/**
* Data
* @Description 请求接口
*/
public interface Data {
String getResult();
} /**
* RealData
* @Description 真实数据比较耗时
*/
public class RealData implements Data { private final String result; public RealData(String send) throws InterruptedException {
StringBuffer buffer=new StringBuffer();
for(int i=0;i<10;i++){
buffer.append(send);
Thread.sleep(100);//模拟真实数据比较耗时
}
result=buffer.toString();
} @Override
public String getResult() {
return result;
}
}
/**
* FutureData
* @Description 功能详细描述
*/
public class FutureData implements Data {
private RealData realData;
private boolean isReady=false; public synchronized void setRealData(RealData realData) {
if (isReady) {
return;
}
this.realData = realData;
isReady=true;
notifyAll();
} @Override
public synchronized String getResult(){
while (!isReady) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realData.getResult();
}
} /**
* Client
* @Description 客户端请求
*/
public class Client {
public Data request(final String seed) {
final FutureData data=new FutureData();
new Thread(){
@Override
public void run() {
try {
RealData realData=new RealData(seed);
data.setRealData(realData);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
return data;
}
} /**
* Test
* @Description future模式测试类
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
Client client=new Client();
Data data=client.request("北风网");
System.out.println("请求结束");
Thread.sleep(2000);//其他工作
System.out.println(data.getResult());
}
}

3、master-worker模式

  核心思想:master接受到任务后分给多个worker去执行,worker执行完后把结果返还给master,再由master将结果合并后返给请求者

/**
* Worker
*/
public class Worker implements Runnable {
//任务列表
Queue<Object> taskQueue;
//结果集
Map<String, Object> resultMap; public void setTaskQueue(Queue<Object> taskQueue) {
this.taskQueue = taskQueue;
} public void setResultMap(Map<String, Object> resultMap) {
this.resultMap = resultMap;
} //worker的具体业务逻辑处理
public Object Handle(Object input){
return input;
} @Override
public void run() {
while (true) {
//获取子任务
Object input=taskQueue.poll();
if (input==null)break;
Object re=Handle(input);
resultMap.put(input.hashCode()+"", re);
}
}
} /**
* Master
*/
public class Master {
//任务队列
private Queue<Object> taskQueue=new ConcurrentLinkedQueue<Object>();
//worker线程队列
private Map<String, Thread> threadMap=new HashMap<String, Thread>();
//子任务结果集
private Map<String, Object> resultMap=new HashMap<String, Object>(); //判断所有的子任务是否已经都完成
public boolean isComplete() {
for(Entry<String, Thread> entry:threadMap.entrySet()){
if (entry.getValue().getState()!= Thread.State.TERMINATED) {
return false;
}
}
return true;
} public Master(Worker worker,Integer workerCount){
worker.setResultMap(resultMap);
worker.setTaskQueue(taskQueue);
for(int i=0;i<workerCount;i++){
threadMap.put(i+"", new Thread(worker,i+""));
}
} public void submit(Object job) {
taskQueue.add(job);
} public Map<String, Object> getResultMap() {
return resultMap;
} public void execute() {
for(Entry<String, Thread> entry:threadMap.entrySet()){
entry.getValue().start();
}
}
} public class PlusWorker extends Worker {
@Override
public Object Handle(Object input) {
int i=(int) input;
return i*i*i;
}
} /**
* Test
* @Description 测试master-worker模式
*/
public class Test {
public static void main(String[] args) {
Master master=new Master(new PlusWorker(), 5);
for(int i=0;i<100;i++){
master.submit(i);
}
master.execute();
Map<String, Object> resultMap=master.getResultMap();
int sum=0;
while (resultMap.size()>0|| !master.isComplete()) {
String key=null;
for(String k:resultMap.keySet()){
key=k;
break;
}
if (key!=null&&resultMap.get(key)!=null) {
sum+=(Integer)resultMap.remove(key);
}
}
System.out.println(sum);
}
}

4、guardedSuspension模式(保护暂停模式)

  核心思想:当客户端大量请求来请求服务器时,将请求放入到请求队列中,服务器按照队列顺序依次来处理客户端的请求

/**
* Request
* @Description 请求
*/
public class Request {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Request(String name) {
super();
this.name = name;
}
@Override
public String toString() {
return "Request [name=" + name + "]";
}
} /**
* RequestQueue
* @Description 请求队列
*/
public class RequestQueue {
//请求队列
private LinkedList<Request> queue=new LinkedList<Request>(); //服务器获取请求
public synchronized Request getRequest() throws InterruptedException {
while (queue.size()==0) {
this.wait();
}
return queue.remove();
} //客户端添加请求
public synchronized void addRequest(Request request) {
queue.add(request);
this.notifyAll();
}
} /**
* ClientThread
* @Description 客户端请求
*/
public class ClientThread extends Thread {
private RequestQueue requestQueue; public ClientThread(RequestQueue requestQueue,String threadName){
super(threadName);
this.requestQueue=requestQueue;
} @Override
public void run() {
for(int i=0;i<10;i++){
Request request=new Request("当前线程"+Thread.currentThread().getName()+"请求"+i);
requestQueue.addRequest(request);
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("当前线程"+Thread.currentThread().getName()+"请求结束");
}
} /**
* ServerThread
* @Description 服务器处理请求
*/
public class ServerThread extends Thread{
//请求队列
private RequestQueue queue; public ServerThread(RequestQueue queue,String threadName){
super(threadName);
this.queue=queue;
} @Override
public void run() {
while (true) {
Request request;
try {
request = queue.getRequest();
System.out.println("当前线程"+Thread.currentThread().getName()+"处理请求"+request.toString());
sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
} /**
*
* Test
* @Description 保护暂停模式测试
*/
public class Test {
public static void main(String[] args) {
RequestQueue queue=new RequestQueue();
//服务器开启10个线程处理客户端的请求
for(int i=0;i<10;i++){
new ServerThread(queue, "server"+i).start();
} //模拟10个客户端向服务器发起请求
for(int i=0;i<10;i++){
new ClientThread(queue, "client"+i).start();
}
}
}

5、生产者消费者模式

  核心思想:生产者把生产好的数据放入到中间缓冲区(队列中),消费者冲从中间缓冲中获取数据进行消费

  

/**
* PcData
* @Description 数据
*/
public class PcData {
private final Integer data; public PcData(Integer data) {
this.data = data;
} public Integer getData() {
return data;
} @Override
public String toString() {
return "PcData [data=" + data + "]";
}
} /**
* Productor
* @Description 生产者
*/
public class Productor implements Runnable{
/**
* volatile 声明的变量表示是不稳定的,每次使用它时必须从主存(共享内存)中进行读取,
* 每次修改后,强迫线程将变化后的值写回到共享内存中
* 这样保证任何时候,两个不同线程总是看到某个变量的同一个值
*/
private volatile boolean isRunning=true; //数据队列
private BlockingQueue<PcData> blockingQueue=null; private static AtomicInteger count=new AtomicInteger(); public Productor(BlockingQueue<PcData> blockingQueue){
this.blockingQueue=blockingQueue;
} public void stop(){
this.isRunning=false;
} @Override
public void run() {
PcData data=null;
Random random=new Random();
System.out.println("启动生产者:"+Thread.currentThread().getId());
while (isRunning) {
try {
Thread.sleep(random.nextInt(1000));
data=new PcData(count.incrementAndGet());
System.out.println(data+"放入到了队列中");
//如果空间不足等待2秒
if (blockingQueue.offer(data, 2, TimeUnit.SECONDS)) {
System.out.println(data+"已经放入到了队列中");
}
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
} /**
* Customer
* @Description 消费者
*/
public class Customer implements Runnable { private BlockingQueue<PcData> blockingQueue; public Customer(BlockingQueue<PcData> blockingQueue){
this.blockingQueue=blockingQueue;
} @Override
public void run() {
System.out.println("启动消费者:"+Thread.currentThread().getId());
Random random=new Random();
while (true) {
PcData data;
try {
data = this.blockingQueue.take();
if (data!=null) {
System.out.println("消费了数据:"+data.toString());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} /**
 * Test
 * @Description 测试生产者消费者模式
 */
public class Test {
    public static void main(String[] args) {
        //数据列表
        BlockingQueue<PcData> blockingQueue=new LinkedBlockingQueue<PcData>(10);
        //生产者
        Productor productor01=new Productor(blockingQueue);
        Productor productor02=new Productor(blockingQueue);
        Productor productor03=new Productor(blockingQueue);
        //消费者
        Customer customer01=new Customer(blockingQueue);
        Customer customer02=new Customer(blockingQueue);
        Customer customer03=new Customer(blockingQueue);
        //使用线程池节省开销
        ExecutorService executorService=Executors.newCachedThreadPool();
        executorService.execute(productor01);
        executorService.execute(productor02);
        executorService.execute(productor03);
        executorService.execute(customer01);
        executorService.execute(customer01);
        executorService.execute(customer01);
    }
}

  

java性能调优03的更多相关文章

  1. Java性能调优笔记

    Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...

  2. Java性能调优(一):调优的流程和程序性能分析

     https://blog.csdn.net/Oeljeklaus/article/details/80656732 Java性能调优 随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我 ...

  3. Java性能调优:利用JMC分析性能

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...

  4. Java性能调优:利用JFR生成性能日志

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...

  5. 第六章 Java性能调优工具(待续)

    Java性能调优工具 Windows工具 JDK命令行工具 JConsole工具 Visual VM多合一工具 Visual VM对QQL的支持 MAT内存分析工具 MAT对QQL的支持 JProfi ...

  6. java 性能调优和GC

    JAVA 性能调优和GC http://blog.csdn.net/gzh0222/article/details/7663181 JAVA GC调优手记 http://blog.csdn.net/f ...

  7. Java性能调优概述

    目录 Java性能调优概述 性能优化有风险和弊端,性能调优必须有明确的目标,不要为了调优而调优!!!盲目调优,风险远大于收益!!! 程序性能的主要表现点 执行速度:程序的反映是否迅速,响应时间是否足够 ...

  8. Java性能调优攻略全分享,5步搞定!(附超全技能图谱)

    对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...

  9. Java性能调优实战,覆盖80%以上调优场景

    Java 性能调优对于每一个奋战在开发一线的技术人来说,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 日渐复杂的系统,错综复杂的性能调优,都对Java工程师的技术广度和技术深度提出了更 ...

随机推荐

  1. JavaScript的日期对象

    1.Date对象用来处理日期和时间. 2.创建Date对象的语法: var myDate = new Date(); 3.Date对象的常用方法: 格式:Date.XX(); getDate() 从 ...

  2. javascript中数组的应用总结

    最近在总结javascript的相关应用,今天对js中的数组部分进行归纳总结,以便在以后的工作中有所参考. 1.在js中数组的定义方式有两种: var a = [1,2,3,4]; var b = n ...

  3. java 多线程 线程安全及非线程安全的集合对象

    一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用.防止出现数据不一致或 ...

  4. setclock - 用系统时间来设置硬件时间

    总览 setclock 描述 setclock 用当前系统时钟存储的时间设置系统的硬件时间. 它先读取 /etc/sysconfig/clock 的时间格式, 时间存储前应该转化成这种格式. Red ...

  5. android中返回数据给上一个活动,可以用来回显数据

    (一)who简介:没错,就是startActivityForResult()方法,这个方法用来在活动被销毁的时候返回数据给上一个方法.参数说明: startActivityForResult(inte ...

  6. [css知识体系]flexbox模型

    背景 flexbox 模型的产生主要是为给布局.对齐和容器内的空间分配提供一个更有效的方法,即使尺寸未知或是动态改变的(flex,收缩,弹性 就是为此命名). flex布局使得容器能够改变子元素的宽高 ...

  7. EventBus总结(原)

    1.EventBus的作用 EventBus is a publish/subscribe event bus for Android and Java. EventBus可以被用来在各种自定义的监听 ...

  8. ubuntu Oracle SQL Developer 安装

    一. 官网下载oracle 安装包 二.下载完毕后,检查你的Ubuntu是否安装了tar和alien sudo apt-get install tar sudo apt-get install ali ...

  9. PHP上传文件和下载

    PHP 中文件上传的基础知识: 1)客户端 form 表单设置 必须设置的 form 表单项: <!DOCTYPE html> <html> <head> < ...

  10. Vue项目中使用Vux

    最近想用vue+vux写一个项目,于是到vux的官网看了文档开始着手搭建项目,但是遇到一些坑.下面简单说下安装vux 的过程.默认已安装vue环境1.安装vux npm install vux --s ...