Java基础
Java SE 知识 集合 锁 多线程 线程池
十四说四十、
一只努力搬砖的985小硕
展开
-
volatile关键字
volatile 特性保障了线程之间的可见性,这其中可见性的保证是基于CPU的内存屏障指令,被JSR-133抽象为happens-before原则(先行发生原则)阻止编译时和运行时的指令重排,编译时JVM编译器遵循内存屏障的约束,运行时依靠CPU屏障指令来阻止重排。如何保证的可见性?为了保证效率,线程对共享变量的操作都是在工作内存中进行的,不能直接读写主内存的变量。为了提高效率,jvm采用性能较高的工作内存。主内存中存储的是共享变量的本尊,工作内存中存储的是主内存中的副本。另外不同线程之间原创 2020-08-17 23:27:55 · 131 阅读 · 0 评论 -
TCP三次握手与四次挥手
目录一. 概述二. 三次握手四次挥手过程2.1 三次握手2.1.1 为啥不是两次握手或者四次握手2.2 四次挥手2.2.1 为啥需要四次挥手一. 概述首先,TCP 是基于连接的,也就是在进行数据传输之前,客户端与服务端(或者说是通信的双方)需要先建立一个可信的连接。是一种基于全双工的可信传输协议。在数据传输结束后,再通过一种协定的方式断开连接,由通信的双方释放资源。这里涉及到的,就是常说的...原创 2020-03-21 09:47:31 · 136 阅读 · 0 评论 -
hashCode()与 equals() 与 == 的区别,重写equals() 不重写hashCode() 会发生什么?
== (运算符?)对于基本数据类型 == 比较的是内容对于引用数据类型 == 比较的是内存地址equals()判断的是“等价”Object类中 定义的是 对象的内存地址相同才是等价public boolean equals(Object obj) { return (this == obj); }但是我们可以自己定义一种等价关系,比如我有一个学生类,描述如下...原创 2019-11-15 22:48:30 · 364 阅读 · 0 评论 -
Java -- 基本类型和包装类型的区别
六年前,我从苏州回到洛阳,抱着一幅“海归”的心态,投了不少简历,也“约谈”了不少面试官,但仅有两三个令我感到满意。其中有一位叫老马,至今还活在我的手机通讯录里。他当时扔了一个面试题把我砸懵了:说说基本类型和包装类型的区别吧。我当时二十三岁,正值青春年华,从事 Java 编程已有 N 年经验(N < 4),自认为所有的面试题都能对答如流,结果没想到啊,被“刁难”了——原来洛阳这块互联网的荒漠...转载 2019-10-17 20:50:00 · 167 阅读 · 0 评论 -
Java-new对象时的内存分析
一个简单的代码:public class User { //用户姓名 String name; //用户年龄 int age; //用户的地址 Address addr;}public class Address { //用户所生活的城市 String city; //用户生活的街道 String street;}public cl...原创 2019-10-14 22:18:26 · 240 阅读 · 0 评论 -
AbstractQueuedSynchronizer
AQS(全称AbstractQueuedSynchronizer)是一个抽象类。被设计利用一个原子int值表示状态的同步器的一个基类。是JDK提供的一个实现FIFO的等待队列的阻塞锁和相关同步器的一个同步框架。Nodestatic final class Node { static final Node SHARED = new Node(); static final Node EXCLUSIVE = null; static final in.原创 2020-08-10 16:17:22 · 111 阅读 · 0 评论 -
线程池 简单总结
newCachedThreadPool:corePoolSize == 0maximumPoolSize == Integer.MAX_VALUEkeepAliveTime == 60Lunit == TimeUnit.SECONDSworkQueue == SynchronousQueue(同步队列)通俗:当有新任务到来,则插入到SynchronousQueue中,由于SynchronousQueue是同步队列,因此会在池中寻找可用线程来执行,若有可以线程则执行,若没有可用线程则创建一个线原创 2020-07-28 14:02:18 · 153 阅读 · 0 评论 -
Java -各种锁
悲观锁/乐观锁这是一种策略。悲观锁的意思就是对一个数据的并发操作前都会有其他线程修改,然后我每次都需要加锁。在Java中的应用就是各种锁。乐观锁的意思就是认为不会有其他线程干扰,在尝试更新的时候先会读取现在的值,然后在更新前判断这个值是否被更新过,更新过那么就不断循环判断。思路代码:sychronized1.6之前 synchronized 都是重量级锁1.6 之后进行了 锁的升级 ...原创 2019-12-13 14:54:19 · 85 阅读 · 0 评论 -
Jav多线程 - 线程通信
传统的线程通信Object 类下的 wait() notify() notifyAll()这三个方法必须由同步监视器来调用对于synchronized修饰的同步方法 默认的同步监视器就是this对于synchronized修饰的同步代码块,同步监视器就是括号后面的对象,必须由该对象调用这三个方法下面的同步监视器就是accountpublic class DrawThread ext...原创 2019-12-05 19:30:37 · 288 阅读 · 0 评论 -
Java高并发编程-多线程实现方式
多线程有三种实现方式:直接继承Thread 类实现Runnable 接口 --无返回值 无异常操作实现Callable 接口 --有返回值 有异常操作话不多说 第一种就不说了 说下下面的两种:实现Runnable 接口实现Callable 接口下面的demo 可以直观的显示实现的过程package threadPool;import java.util.con...原创 2019-10-08 21:26:36 · 139 阅读 · 0 评论 -
Java高并发编程-并发容器
火车票销售的问题引出并发问题题目:有N张火车票,每张票都有一个编号,同时有10个窗口对外售票实现一:使用ArrayList因为list的remove操作是非原子性的,所以多个线程在同时remove的时候可能会操作同一张票代码如下:public class TicketSeller1 { private static List<String> tickets = n...原创 2019-10-05 17:16:00 · 165 阅读 · 0 评论 -
Java高并发编程-线程状态
首先是线程的五种状态:新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。运行状态(Ru...原创 2019-09-30 21:48:50 · 106 阅读 · 0 评论 -
线程安全的单例模式
不用加锁,实现的是懒加载的方式使用静态内部类的方式首先说一下static。static作用是把类的成员变成类相关,而不是实例相关,也就是static是把成员变量或者方法提升到类层级。我们规定一下Public 修饰的类叫做外部类,里面所有的类叫做内部类。public class Singleton {// ---外部类 class AAA{ // ----内部类 /...原创 2019-09-27 22:57:44 · 99 阅读 · 0 评论 -
Java高并发编程-同步监视器
释放同步监视器的锁定(1)流程执行结束(2)在同步代码块中遇到了break,return(3)在什么情况下不会释放锁死锁与阻塞的区别原创 2019-09-25 23:35:58 · 140 阅读 · 0 评论 -
Java高并发编程-ThreadLocal
下面是测试ThreadLcal 的简单的例子package thread.threadlocal_demo;class Account { //定义一个ThreadLocal 类型的变量 该变量将是一个线程局部变量 每一个线程都将拥有该变量一个副本 private ThreadLocal<String> name = new ThreadLocal<>...原创 2019-09-23 22:00:09 · 168 阅读 · 0 评论 -
Java 内部类和静态内部类
/**总结:1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。3.实例化一个非静态的内部类的方法:a.先生成一个外部类对象实例OutClassTest oc1 = new OutClassTest();b.通过外部类的对象实例生成内部类对象Ou...转载 2019-10-08 12:52:05 · 183 阅读 · 0 评论