
java
Etwases
这个作者很懒,什么都没留下…
展开
-
CentOS 7 部署tomcat多实例
前提是jdk和环境变量都设置好,如果没有设置请先设置好一、安装 Tomcat前往 Apache Tomcat 下载 apache-tomcat-XXXXXX.tar.gz解压并移到 /usr/local/ 下面:tar -zxvf apache-tomcat-XXXXXX.tar.gzmv apache-tomcat-XXXXXX /usr/local/tomcat部署 tomcat 多实例1、创建实例的目录mkdir /Server/Domain/tomcat_01.原创 2020-07-16 17:50:14 · 305 阅读 · 0 评论 -
JVM垃圾收集器
JVM垃圾收集器四大垃圾收集算法标记整理标记清除复制算法分代收集算法准确来讲,跟前面三种算法有所区别。分代收集算法就是根据对象的年代,采用上述三种算法来收集。对于新生代:每次GC都有大量对象死去,存活的很少,常采用复制算法,只需要拷贝很少的对象。对于老年代:常采用标整或者标清算法。四种垃圾收集器Java 8可以将垃圾收集器分为四类。串行收集器Serial为单线程环境设计且只使用一个线程进行GC,会暂停所有用户线程,不适用于服务器。就像去餐厅吃饭,只有一个清洁工在打扫。原创 2020-06-04 14:06:53 · 554 阅读 · 0 评论 -
JAVA OutOfMemoryError详解
OutOfMemoryErrorStackOverflowError栈满会抛出该错误。无限递归就会导致StackOverflowError,是java.lang.Throwable→java.lang.Error→java.lang.VirtualMachineError下的错误。参考:public class StackOverflowErrorDemo { public static void main(String[] args) { stackOverflowErro原创 2020-06-03 09:24:48 · 285 阅读 · 0 评论 -
JAVA JVM 四大引用详解及测试代码
文章目录四大引用强引用软引用弱引用WeakHashMap虚引用引用队列最近重新看jvm,做下记录四大引用以下Demo都需要设置-Xmx和-Xms,不然系统默认很大,很难演示。强引用使用new方法创造出来的对象,默认都是强引用。GC的时候,就算内存不够,抛出OutOfMemoryError也不会回收对象,死了也不回收。参考:public class StrongReferenceDemo { public static void main(String[] args) {原创 2020-05-30 11:15:08 · 261 阅读 · 0 评论 -
JAVA JVM 参数详解
JVM参数JVM 三种类型参数标配参数比如-version、-help、-showversion等,几乎不会改变。X参数用得不多,比如-Xint,解释执行模式;-Xcomp,编译模式;-Xmixed,开启混合模式(默认)。XX参数重要,用于JVM调优。JVM XX参数布尔类型公式:-XX:+某个属性、-XX:-某个属性,开启或关闭某个功能。比如-XX:+PrintGCDetails,开启GC详细信息。KV键值类型公式:-XX:属性key=值value。比如-XX:Metaspace原创 2020-05-25 14:07:51 · 276 阅读 · 0 评论 -
JAVA 阻塞队列(BlockingQueue)的实际应用详解(生产者消费者&&线程池)
阻塞队列的应用——生产者消费者传统模式传统模式使用Lock来进行操作,需要手动加锁、解锁。参考:import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;public class CallableDemo { public static void main(String[] args) throws原创 2020-05-23 10:24:27 · 1663 阅读 · 0 评论 -
JAVA 阻塞队列详解及代码示例
阻塞队列概念:当阻塞队列为空时,获取(take)操作是阻塞的;当阻塞队列为满时,添加(put)操作是阻塞的。好处:阻塞队列不用手动控制什么时候该被阻塞,什么时候该被唤醒,简化了操作。体系:Collection→Queue→BlockingQueue→七个阻塞队列实现类。类名作用ArrayBlockingQueue由数组构成的有界阻塞队列LinkedBlockingQueue由链表构成的有界阻塞队列PriorityBlockingQueue支持优先级排序的无界阻原创 2020-05-22 11:19:41 · 416 阅读 · 0 评论 -
JAVA 并发编程 CountDownLatch/CyclicBarrier/Semaphore
CountDownLatchCountDownLatch内部维护了一个计数器,只有当计数器==0时,某些线程才会停止阻塞,开始执行。CountDownLatch主要有两个方法,countDown()来让计数器减一(-1),await()来让线程阻塞。当count==0时,阻塞线程自动唤醒。案例一班长关门:main线程是班长,6个线程是学生。只有6个线程运行完毕,都离开教室后,main线程班长才会关教室门。案例二秦灭六国:只有6国都被灭亡后(执行完毕),main线程才会显示“秦国一统天下”。枚举类的原创 2020-05-21 16:51:10 · 284 阅读 · 0 评论 -
JAVA Synchronized和Lock的区别
Synchronized和Lock的区别synchronized关键字和java.util.concurrent.locks.Lock都能加锁,两者有什么区别呢?原始构成:sync是JVM层面的,底层通过monitorenter和monitorexit来实现的。Lock是JDK API层面的。(sync一个enter会有两个exit,一个是正常退出,一个是异常退出)使用方法:sync不需要手动释放锁,而Lock需要手动释放。是否可中断:sync不可中断,除非抛出异常或者正常运行完成。Lock是可中原创 2020-05-21 09:47:34 · 279 阅读 · 1 评论 -
Java 公平锁/非公平锁 可重入锁/递归锁 自旋锁 读写锁/独占/共享锁 详解
公平锁/非公平锁概念:所谓公平锁,就是多个线程按照申请锁的顺序来获取锁,类似排队,先到先得。而非公平锁,则是多个线程抢夺锁,会导致优先级反转或饥饿现象。区别:公平锁在获取锁时先查看此锁维护的等待队列,为空或者当前线程是等待队列的队首,则直接占有锁,否则插入到等待队列,FIFO原则。非公平锁比较粗鲁,上来直接先尝试占有锁,失败则采用公平锁方式。非公平锁的优点是吞吐量比公平锁更大。synchronized和juc.ReentrantLock默认都是非公平锁。ReentrantLock在构造的时候传入tru原创 2020-05-20 14:59:10 · 399 阅读 · 0 评论 -
JAVA list、set、map等集合类线程不安全的问题及解决方法
ListArrayList不是线程安全类,在多线程同时写的情况下,会抛出java.util.ConcurrentModificationException异常。private static void listNotSafe() { List<String> list=new ArrayList<>(); for (int i = 1; i <= 30; i++) { new Thread(() -> { list原创 2020-05-19 15:13:20 · 4098 阅读 · 0 评论 -
java JMM 和 volatile关键字
JMMJMM是指Java内存模型,不是Java内存布局,不是所谓的栈、堆、方法区。每个Java线程都有自己的工作内存。操作数据,首先从主内存中读,得到一份拷贝,操作完毕后再写回到主内存。JMM可能带来可见性、原子性和有序性问题。所谓可见性,就是某个线程对主内存内容的更改,应该立刻通知到其它线程。原子性是指一个操作是不可分割的,不能执行到一半,就不执行了。所谓有序性,就是指令是有序的,不会被重排。volatile关键字volatile关键字是Java提供的一种轻量级同步机制。它能够保证可见性和有序原创 2020-05-18 13:42:06 · 179 阅读 · 0 评论 -
JAVA CAS 底层原理详解
CASCAS是指Compare And Swap,比较并交换,是一种很重要的同步思想。如果主内存的值跟期望值一样,那么就进行修改,否则一直重试,直到一致为止。public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger=new AtomicInteger(5); System.out.println(atomicInteger.compareA原创 2020-05-16 13:10:22 · 1680 阅读 · 1 评论 -
JAVA CAS引入的ABA问题 以及如何解决问题
ABA问题所谓ABA问题,就是比较并交换的循环,存在一个时间差,而这个时间差可能带来意想不到的问题。比如线程T1将值从A改为B,然后又从B改为A。线程T2看到的就是A,但是却不知道这个A发生了更改。尽管线程T2 CAS操作成功,但不代表就没有问题。有的需求,比如CAS,只注重头和尾,只要首尾一致就接受。但是有的需求,还看重过程,中间不能发生任何修改,这就引出了AtomicReference原子引用。AtomicReferenceAtomicInteger对整数进行原子操作,如果是一个POJO呢?可以原创 2020-05-17 11:19:08 · 518 阅读 · 0 评论