1、简介 Java有四种锁状态:无锁、偏向锁、轻量锁、重量锁,锁可以逐渐升级,但是不可以降级。 2、锁状态 在Java中对象的锁存储在对象头Mark Word中(该字段存储对象的hashcode或者锁信息) 2.1、偏向锁 2.1.1、获取 当一个线程访问同步代码块并获取锁的时候,会在对象头和栈帧中的锁记录里存储偏向锁的线程ID,以后该线程在进入和退出同步块时,不需要进行CAS加锁和解锁,会查询对象头中Mark Word是否存储着指向该线程的偏向锁,如果成功,表示线程已经获得了锁。如果失败,则需要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁):如果没有设置,则使用CAS竞争锁;如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程; 2.1.2、撤销 当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放偏向锁。当另一个线程试图访问偏向锁时,会首先暂停拥有偏向锁的进程,如果线程没有运行,则将对象锁的对象头设置为无锁状态。如果线程正在运行,则会暂停该线程,恢复到无锁状态,或者标记对象不适合作为偏向锁,最后唤醒该线程。 2.1.3、优缺点 偏向锁适用于大多数时候.... 有更新! java锁状态基本概念 程序人生
volatile允许线程访问这个共享变量,一个字段被声明为volatile,则java内存模型确保所有线程看到这个变量的值是一致的。 有volatile变量修饰的共享变量进行写操作的时候会触发以下两件事: 1.将当前缓存行的数据写回到系统内存; 2.这个写回内存的操作,使其他处理器缓存的该数据的内存地址失效。 如果对声明了volatile的变量进行写操作,JVM会将这个变量所在缓存行的数据写回到系统内存,之后其他处理器通过嗅探在缓存总线上传播的数据看自己缓存的数据是否过期,当处理器发现缓存行对应的数据被修改,就会将这个数据所在的缓存行设置为无效状态,当处理器对这个缓存行重新进行操作时,会重新从系统内存读取该数据到缓存行。 有更新! 了解下volatile 程序人生
1、错误信息 2、问题跟踪及处理 可以看到,这个方法传递了一个Class对象和类加载器和一个字段给clearMap方法 进入clearMap方法,方法根据class对象获取属性,此时报出了属性找不到的错误 打开tomcat的源码查看这个被反射的类org.apache.catalina.loader.WebappClassLoader(tomcat源码地址) 在这个类中发现,他继承了org.apache.catalina.loader.WebappClassLoaderBase,自己本身没有定义属性 进入WebappClassLoaderBase类中,可以找到resourceEntries字段 查看WebappClassLoaderBase的注释信息发现从7.0.64往后的版本,添加了WebappClassLoaderBase用来作为类加载器 此时有两个解决方案,一是对structs版本升级,但是这样的话,对应的其他依赖版本也要升级,代价太大,第二个方法较为简单,直接更换tomcat版本使其版本号<7.0.64即可,我换了7.0.63就正常了 有更新! struct2在tomcat运行报错--java.lang.NoSuchFieldException resourceEntries 程序人生
今天接到任务,需要对一个web项目进行结构整改,该项目运行再tomcat中,启动的时候,一个报端口被占用 运行命令查看1099端口,发现没有程序再使用这个端口 netstat -ano | findstr 1099 最后发现是因为自己装了一个docker,启用了hype-v占用了端口 netsh interface ipv4 show excludedportrange protocol=tcp 此时更换一个没有被占用的端口、或者关闭hype-v、或者让hype-v不占用这个端口都是可行的。 可以使用下面的命令开放该端口: netsh int ipv4 add excludedportrange protocol=tcp startport=8080 numberofports=1 参考:https://github.com/docker/for-win/issues/3171 有更新! hype-v占用端口,导致idea无法运行tomcat应用 程序人生
mvn install:install-file -Dfile=jar包的路径 -DgroupId=groupId -DartifactId=artifactId -Dversion=版本号 -Dpackaging=jar 执行后,再maven中添加依赖即可; 再改造老项目的时候,会遇到一种情况,项目的开发者再使用jar包的时候,没有使用maven(或其他依赖软件)做依赖管理,此时,若要对老项目进行改造,这些依赖的引入就成了一个问题,如果是常见的类,大概都能判断使用的是哪个依赖,直接引入,但是有些项目使用的依赖很小众,甚至再maven仓库中都找不到,此时就需要自己安装到本地仓库,此时,我么可以将所有的jar解压到本地的一个文件夹中,然后使用everything搜索哪个jar中含有自己的类,就把这个jar安装到本地仓库,这样一个一个的对着找。 例如: 我们现在有个一类不知道是属于哪个jar包的 到everything中搜索结果如下: 发现第一个class所在的包,路径也和代码中的匹配,就将这个依赖,安装到本地仓库,再引入就可以了 有更新! maven安装jar到本地 程序人生
简介 nio主要是通过WatchService、Watchkey和Path来实现文件的监控; 代码实现 public class FileMonitor { private WatchService watcher; public FileMonitor(String directory) throws IOException { watcher = FileSystems.getDefault().newWatchService(); Path path = Paths.get(directory); path.register(watcher, ENTRY_CREATE, ENTRY_MODIFY,ENTRY_DELETE); } @SuppressWarnings("InfiniteLoopStatement") public void watchFile() throws InterruptedException{ while (true) { WatchKey key = watcher.take(); for (WatchEvent<?> event : key.... 有更新! nio监控文件变化 程序人生