当前位置: 首页 > news >正文

Java重要基本概念理解

熟悉JVM反射机制。

(1)反射的定义
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

(2)反射的理解
java中实现多态的形式主要有三种:向上转型,抽象类实现,接口类实现。
这三种方式实例化的对象数据类型都需要在运行时才能够确定,反射机制诞生之前,我们不能直接获取这些对象的内部信息。但是反射机制诞生之后,我们可以在运行时,实时动态的获取这些对象的具体的数据类型内部信息。

(3)反射的应用
运行时动态获取任意一个类或任意一个对象的内部信息。(包括编译阶段不能确定数据类型的对象和类)
实现解耦操作,用于框架的实现。

互斥同步。

(1)线程同步互斥基本概念

两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行,实现的基础就是通过互斥。

(2)线程同步互斥实现方式

Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized(阻塞同步锁),而另一个是 JDK 实现的 ReentrantLock(非阻塞同步锁)。 其中synchronized 是重量级锁,ReentrantLock是轻量级锁。

  • synchronized锁住的对象与monitor相关联,其中monitor的两条指令:monitorenter和monitorexit 的字节码文件依赖于底层的操作系统的Mutex Lock来实现的 ,由于使用Mutex Lock需要将当前线程挂起并从用户态切换到内核态来执行,这种切换的代价是非常昂贵的 。所以该锁一般应用在极少锁竞争环境。
  • ReentrantLock是基于CAS指令+AQS阻塞队列来实现 。

互斥同步:阻塞同步

synchronized(阻塞同步锁)

互斥同步:非阻塞同步

ReentrantLock(非阻塞同步锁)(lock的子类)(基于CAS实现的乐观锁)

  • CAS就是比较并交换,最常见的应用场景就是,就是在数据库中实现乐观锁,我们一般会在数据库表中字段增加一个version字段,如果要求更高一点会使用时间戳。读取出数据时,将此version字段一同读出。同时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号等于数据库表当前版本号,则予以更新,并将版本号增1,否则认为是过期数据。
  • J.U.C 包里面的整数原子类 AtomicInteger,其中的 compareAndSet() 和 getAndIncrement() 等方法都使用了 Unsafe 类的 CAS 操作。

:基于冲突检测的乐观并发策略 :CAS 指令需要有 3 个操作数,分别是内存地址 V、旧的预期值 A 和新值 B。当执行操作时,只有当 V 的值等于 A,才将 V 的值更新为 B。

synchronized 与ReentrantLock之间的区别

①ReentrantLock显示地获得,释放锁,synchronized隐式获得释放锁

②ReentrantLock可响应中断,synchronized是不可以响应中断的

③ReentrantLock是JDK级别的,synchronized是JVM级别的

④ReentrantLock可以实现公平锁

⑤ReentrantLock通过Condition可以绑定多个条件

⑥底层实现不一样,synchronized是同步阻塞,使用的是悲观并发策略,lock是同步非阻塞,采用的是乐观并发策略。

⑦Lock是一个接口,而synchronized是java中的关键字,synchronized是内置的语言实现

⑧synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象, 因此使用 Lock 时需要在 finally 块中释放锁。

不采用同步措施进行同步

  • 将共享资源存放在一个方法的局部变量之中,因为局部变量存储在虚拟机栈中,属于线程私有的 ,不会出现线程安全问题 。
  • 看看这些共享数据的代码是否能保证在同一个线程中执行。如果能保证,我们就可以把共享数据的可见范围限制在同一个线程之内,这样,无须同步也能保证线程之间不出现数据争用的问题。(一般是本地线程)

死锁

定义:也就是两个线程在各自拥有锁的情况下,又去尝试获取对方的锁,从而造成的一直阻塞的情况。

原因:

①互斥条件:一个资源只能被一个线程占有,当这个资源被占用后其他线程就只能等待。

②不可剥夺条件:当一个线程不主动释放资源时,此资源一直被拥有线程占有。

③请求并持有条件:线程已经拥有一个资源后仍然不满足,又尝试请求新的资源。

④环路等待条件:产生死锁一定是发生了线程资源环路链。

办法:

改变死锁中的任意一个或多个条件就可以解决死锁问题,其中被修改的条件只有后两个:请求并持有条件和环路等待条件。

  • 修改请求并持有条件:获得了一把锁之后不再去请求获取另一把锁
  • 破坏环路等待条件: 首先给线程资源请求编号,规定每个线程,必须按编号递增的顺序请求资源,同一线程一次性获取完所有资源。

内存屏障原理。

内存屏障︰是一种屏障指令,它使得CPU或编译器对屏障指令的前和后所发出的内存操作执行一个排序的约束。也叫内存栅栏或栅栏指令。

内存屏障的能力∶

  • 1∶阻止屏障两边的指令重排序。
  • 2∶写数据的时候加了屏障的话,强制把写缓冲区的数据刷回到主内存中。
  • 3∶读数据的时候加了屏障的话,让工作内存/CPU高速缓存当中缓存的数据失效,重新到主内存中获取新的数据。

基本分类∶

  • 1:读屏障:Load Barrier : 在读指令之前插入读屏障,让工作内存/CPU高速缓存当中缓存的数据失效,重新到主内存中获取新的数据。
  • 2:写屏障: Store Barrier :在写指令之后插入写屏障,强制把写缓冲区的数据刷回到主内存中。

最常使用的指令:StoreLoad:强制把写缓冲区的数据刷回到主内存中,让CPU高速缓存当中缓存的数据失效,重新到主内存中获取新的数据。

volatile

  • 防止重排序:一个对象被volatile修饰,以为着所有对该对象操作的指令,都将按照默认顺序执行,不能按照语义相同就重新排序。
  • 可见性:在某个线程内的cpu缓存区内,如果被volatile修饰的变量被修改,那么就会触发StoreLoad指令,将缓存区内的变量立即写回主内存,并立即使其他线程内cpu缓存内该变量的值失效。
  • 原子性:只能保证单次读写的原子性,不支持多个操作的原子性(也就是不支持事务)

端口

端口是TCP/IP协议族中,应用层进程与传输层协议实体间的通信接口。

TCP/IP协议采用了全局分配(静态分配端口)和本地分配(动态分配端口)相结合的分配方法 。

保留端口的范围是0—1023,又称为众所周知的端口或熟知端口(Well-Known Port) 。

其余的端口号,1024-65535,称为自由端口号,采用本地分配,又称为动态分配的方法。

NAT技术与内网穿透

服务器一般使用的是公网 ip ,因此客户端可以通过NAT技术,将局域网内的ip地址层层转化为公网IP。

但是如果服务器是局域网IP,客户端就无法找到,因为NAT技术只能将ip地址层层转化为公网ip。

因此内网穿透诞生,将局域网ip与公网ip进行映射,因此客户端就可以同过NAT技术将ip地址层层转化为公网ip。

内网穿透方式

  • 第一种是直接拥有公网的ip并直接进行映射;
  • 第二种是有公网服务器的,采用frp等方式来进行穿透(这种方式不需要有公网的ip,但是需要一个服务器);

(1)第一种方式存在两种形式:

​ 第一种:光猫不能进行端口映射,那么将光猫设置为桥接模式,主机连接光猫,直接拨号上网,使用的ip直接为外网ip。

​ 第二种:光猫可以进行端口映射,那么配置光猫进行接口映射,那么间接使用外网IP。

(2)第二种方式属于直接使用远程服务器进行映射。(和翻墙一个道理)

);

(1)第一种方式存在两种形式:

​ 第一种:光猫不能进行端口映射,那么将光猫设置为桥接模式,主机连接光猫,直接拨号上网,使用的ip直接为外网ip。

​ 第二种:光猫可以进行端口映射,那么配置光猫进行接口映射,那么间接使用外网IP。

(2)第二种方式属于直接使用远程服务器进行映射。(和翻墙一个道理)

相关文章:

Java重要基本概念理解

熟悉JVM反射机制。 (1)反射的定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Ja…...

逆向工具之 unidbg 执行 so

1、unidbg 入门 unidbg 是一款基于 unicorn 和 dynarmic 的逆向工具, 可以直接调用 Android 和 IOS 的 so 文件,无论是黑盒调用 so 层算法,还是白盒 trace 输出 so 层寄存器值变化都是一把利器~ 尤其是动态 trace 方面堪比 ida tr…...

zk-STARK/zk-SNARK中IP,PCP,IPCP,IOP,PIOP,LIP,LPCP模型介绍

我们的目标是构造 zkSNARK。在我们的目标场景中,Prover 只需要发送一个简短的证明字符串给 Verifier,而 Verifier 不需要给 Prover 发送任何消息。 直接构造一个满足这个场景的 zkSNARK 可能会很困难。一个更灵活的方式是在先在理想模型下构造证明系统&…...

StreamAPI

StreamAPI 最近开发用上了 Java8的StreamAPI,(咋现在才用?嗯哼,项目需要)自己也不怎么会,来总结一波吧! 别认为好抽象!!!干他就完事 一.StreamAPI介绍 就是用来处理集合的数据 其实到后面会发现和SQL的语句是差不多的~哈哈?你不信?往下面看 Stream:英文翻译叫做流 举个粟子…...

MySQl高可用集群搭建(MGR + ProxySQL + Keepalived)

前言 服务器规划(CentOS7.x) IP地址主机名部署角色192.168.x.101mysql01mysql192.168.x.102mysql02mysql192.168.x.103mysql03mysql192.168.x.104proxysql01proxysql、keepalived192.168.x.105proxysql02proxysql、keepalived 将安装包 mysql_cluster_…...

java+Selenium+TestNg搭建自动化测试架构(3)实现POM(page+Object+modal)

1.Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性。 PageObject设计…...

oracle11g忘记system密码,重置密码

OPW-00001: 无法打开口令文件 cmd.exe 使用管理员身份登录 找到xxx\product\11.2.0\dbhome_1\database\PWDorcl.ora文件,删除 执行orapwd fileD:\app\product\11.2.0\dbhome_1\database\PWDorcl.ora passwordtiger (orapwd 在\product\11.2.0\dbhome_1\BIN目录下…...

黑马 Vue 快速入门 笔记

黑马 Vue 快速入门 笔记0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 七大属性0.5 el:挂载点1 VUE基础1.0 第一个vue代码:Hello,vue1.1 v-bind 设置元素的属性 简写 :1.2 v-if , v-else , v-else-ifv-if , v-e…...

HTTP协议知识体系核心重点梳理

HTTP协议知识体系核心重点梳理TCP/IP协议1.四层模型2.通信过程3.tcp三次握手和四次挥手4.tcp安全传输4. 一次HTTP通信流程HTTP协议HTTP/1.1CookieHttp报文格式内容编码分块传输编码HTTP状态码重定向状态码常用的通用首部cache-controlExpiresConnectionTransfer-Encoding常用的…...

Nginx优化与防盗链

Nginx优化与防盗链 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! &#x1f4c…...

自动驾驶路径规划概况

文章目录前言介绍1. 路径规划在自动驾驶系统架构中的位置2. 全局路径规划的分类2.1 基础图搜索算法2.1.1 Dijkstra算法2.1.2 双向搜索算法2.1.3 Floyd算法2.2 启发式算法2.2.1 A*算法2.2.2 D*算法2.3 基于概率采样的算法2.3.1 概率路线图(PRM)2.3.2 快速…...

某某银行行面试题目汇总--HashMap为什么要扩容

一、HashMap啥时候扩容,为什么扩容? HashMap的默认大小是16。在实际开发过程中,我们需要去存储的数据量往往是大于存储容器的默认大小的。所以,出现容量默认大小不能满足需求时,就需要扩容。而这个扩容的动作是由集合自…...

求职者:“我有五年测试经验”面试官: “不,你只是把一年的工作经验用了五年”

最近看到很多软件测试由于公司裁员而需要重新求职的。他们普遍具有4年甚至更长的工作经验。但求职结果往往都不太理想。 我在与部分软件测试求职者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实,没有持续学习的习惯,但对于…...

Nacos配置中心

什么是配置中心所谓配置中心:在微服务的环境下,将项目需要的配置信息保存在配置中心,需要读取时直接从配置中心读取,方便配置管理的微服务工具我们可以将部分yml文件的内容保存在配置中心一个微服务项目有很多子模块,这些子模块可能在不同的服务器上,如果有一些统一的修改,我们…...

【故障】6、yum不可用

文章目录[toc]一、yum命令不能使用1)报错2)问题分析3)完全删除python及yum重新安装1、删除python2、删除yum3、下载Python依赖rpm包4、下载yum依赖rpm包5、强制安装python6、强制安装yum7、测试一、yum命令不能使用 1)报错 Ther…...

深度解读 | 数据资产管理面临诸多挑战,做好这5个措施是关键

日前,大数据技术标准推进委员会(中国通信标准化协会下(CCSA)的专业技术委员会,简称TC601)发布《数据资产管理实践白皮书》(6.0 版)(以下简称:报告&#xff09…...

双检测人脸防伪识别方法(活体检测+人脸识别+关键点检测+人像分割)

双检测人脸防伪识别=人脸检测+活体检测+人脸识别 1.人脸关键点+语义分割 使用mediapipe进行视频人脸关键点检测和人像分割: import time import cv2 import mediapipe as mp import numpy as npmp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solution…...

2023年3月 - 笔记

内容已复习 采用下划线标识内容已重写 并补充优化 新建文章并添加超链接 背景颜色 绿色 Python 2023年3月1日 Python 把列表转成元组 # 1、Python 把列表转成元组 使用tuple 即可 list_a [1, 2, 3, 4, 5, 6] list_b tuple(list_a) print(list_b)# 2、如果想把 元组转成列…...

浅谈Redisson实现分布式锁对原理

1.Redisson简介 Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,我没有说“最好”)的编程语言之一。虽然两者看起来很自然地在一起“工作”,但是要知道,Redis 其实并没有对 Java…...

struts1.2升级struts2.5.30问题汇总

严重: 配置应用程序监听器[org.apache.struts2.tiles.StrutsTilesListener]错误java.lang.NoClassDefFoundError: org/apache/tiles/web/startup/AbstractTilesListenerat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader…...

电动汽车充放电的优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

《JeecgBoot系列》 如何设计表单实现“下拉组件二级联动“ ? 以省市二级联动为例

《JeecgBoot系列》 如何设计表单实现"下拉组件二级联动" ? 以省市二级联动为例 一、准备字典表 1.1 创建字典表 CREATE TABLE sys_link_table ( id int NULL, pid int NULL, name varchar(64) null );1.2 准备数据 idpidname1全国21浙江省32杭州市42宁波市51江苏…...

数学小课堂:数学的线索(从猜想到定理再到应用的整个过程)

文章目录 引言I 勾股定理1.1 勾三股四弦五1.2 数学和自然科学的三个本质差别1.3 总结引言 从猜想到定理再到应用的整个过程是数学发展和体系构建常常经历的步骤。 I 勾股定理 勾股定理: 直角三角形两条直角边的平方之和等于斜边的平方,这个定理在国外都被称为毕达哥拉斯定理…...

Collecting package metadata (current_repodata.json): failed

一、问题描述 安装anaconda之后,想创建环境,用了下面这段代码: conda create -n pytorch python3.7 conda创建环境报错了,报了如下这一堆: Collecting package metadata (current_repodata.json): failedUnavailab…...

几十亿工单表,查询优化案例

前言: 之前在某大型保险公司担任技术经理,负责优化话务系统模块,由于系统已经运行10年之久,尤其在话务系统中,沉积了几十亿的话务信息表,业务人员反馈,话务系统历史数据查询部分已经完全查询不动&#xff0…...

LabVIEW应用程序(EXE)无法正确动态调用插件

LabVIEW应用程序(EXE)无法正确动态调用插件正在构建一个应用程序并使用插件架构,以便可以动态调用将来创建的VI(插件)。应用程序在LabVIEW开发环境中可以正常运行,但不能作为可执行程序运行。运行可执行文件…...

到了35岁,软件测试职业发展之困惑如何解?

35岁,从工作时间看,工作超过10年,过了7年之痒,多数IT人都已经跳槽几次。 35岁,发展比较好的软件测试人,已经在管理岗位(测试经理甚至测试总监)或已经成为测试专家或测试架构师。发展…...

Google Guice 3:Bindings(1)

1. 序言 上一篇博客,《Google Guice 2:Mental Model》,讲述了Guice的建模思路:Guice is a map Guice官网认为:binding是一个对象,它对应Guice map中的一个entry,通过创建binding就可以向Guice …...

学习国家颁布的三部信息安全领域法律,理解当前工作中的信息安全合规要求

目录三部信息安全领域的法律文件三部法律的角色定位与联系三部法律的适用范围三部法律的主要履职部门三部法律条文章节结构中的共性三部法律中的一些次重点章节网络安全法的重点章节数据安全法的重点章节个人信息保护法的重点章节关于工业和信息化部行政执法项目清单三部信息安…...

LeetCode_Python_二分查找算法

二分查找算法要求二分查找过程如何更新左右边界实例type1:常规记录中间元素type2:取跳出循环后的左或右边界算法要求 顺序存储结构元素大小有序 二分查找过程 将元素排序;将中间位置记录的这个元素与目标元素比较; 2.1 如果相同&a…...