-
观察者模式对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式UML图看不懂图的人端着小板凳到这里来,给你举个栗子:假设有三个人,小美(女,22),小王和小李。小美很漂亮,小王和小李是两个程序猿,时刻关注着小美的一举一动。有一天,小美说了一句:“谁来陪我打游戏啊。”这句话被小王和小李听到了,结果乐坏了,蹭蹭蹭,没一会儿,小王就冲到小美家门口了,在这里,小美是被观察者,小王和小李是观察者,被观察者发出一条信息,然后观察者们进行相应的处理,看代码:public interface Person { //小王和小李通过这个接口可以接收到小美发过来的消息 void getMessage(String s);}这个接口相当于小王和小李的电话号码,小美发送通知的时候就会拨打getMessage这个电话,拨打电话就是调用接口,看不懂没关系,先往下看public class LaoWang implements Person { private String name = "小王"; public LaoWang() { } @Override public void getMessage(String s) { System.out.println(name + "接到了小美打过来的电话,电话内容是:" + s); }}public class LaoLi implements Person { private String name = "小李"; public LaoLi() { } @Override public void getMessage(String s) { System.out.println(name + "接到了小美打过来的电话,电话内容是:->" + s); }}代码很简单,我们再看看小美的代码:public class XiaoMei { List<Person> list = new ArrayList<Person>(); public XiaoMei(){ } public void addPerson(Person person){ list.add(person); } //遍历list,把自己的通知发送给所有暗恋自己的人 public void notifyPerson() { for(Person person:list){ person.getMessage("你们过来吧,谁先过来谁就能陪我一起玩儿游戏!"); } }}我们写一个测试类来看一下结果对不对public class Test { public static void main(String[] args) { XiaoMei xiao_mei = new XiaoMei(); LaoWang lao_wang = new LaoWang(); LaoLi lao_li = new LaoLi(); //小王和小李在小美那里都注册了一下 xiao_mei.addPerson(lao_wang); xiao_mei.addPerson(lao_li); //小美向小王和小李发送通知 xiao_mei.notifyPerson(); }}
-
简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。单例模式实现起来也很容易,直接看demo吧public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton;}}按照我的习惯,我恨不得写满注释,怕你们看不懂,但是这个代码实在太简单了,所以我没写任何注释,如果这几行代码你都看不明白的话,那你可以洗洗睡了,等你睡醒了再来看我的博客说不定能看懂。上面的是最基本的写法,也叫懒汉写法(线程不安全)下面我再公布几种单例模式的写法:懒汉式写法(线程安全)public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }饿汉式写法public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }静态内部类public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }枚举public enum Singleton { INSTANCE; public void whateverMethod() { } }这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏。双重校验锁public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
-
【功能模块】我们要调 flink sql 例子,【操作步骤&问题现象】我们要调 flink sql 例子,1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)flink run --class com.huawei.bigdata.flink.examples.JavaStreamSqlExample <path of StreamSqlExample jar>*********************************************************************************------------------------------------------------------------ The program finished with the following exception:org.apache.flink.client.program.ProgramInvocationException: The main method caused an error. at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:546) at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:421) at org.apache.flink.client.program.ClusterClient.run(ClusterClient.java:430) at org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:814) at org.apache.flink.client.cli.CliFrontend.runProgram(CliFrontend.java:288) at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:213) at org.apache.flink.client.cli.CliFrontend.parseParameters(CliFrontend.java:1051) at org.apache.flink.client.cli.CliFrontend.lambda$main$11(CliFrontend.java:1127) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1729) at org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41) at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:1127)Caused by: org.apache.flink.table.api.TableException: Could not instantiate the executor. Make sure a planner module is on the classpath at org.apache.flink.table.api.java.internal.StreamTableEnvironmentImpl.lookupExecutor(StreamTableEnvironmentImpl.java:152) at org.apache.flink.table.api.java.internal.StreamTableEnvironmentImpl.create(StreamTableEnvironmentImpl.java:118) at org.apache.flink.table.api.java.StreamTableEnvironment.create(StreamTableEnvironment.java:112) at com.huawei.bigdata.flink.examples.JavaStreamSqlExample.main(JavaStreamSqlExample.java:32) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:529) ... 12 moreCaused by: org.apache.flink.table.api.NoMatchingTableFactoryException: Could not find a suitable table factory for 'org.apache.flink.table.delegation.ExecutorFactory' inthe classpath.Reason: No factory implements 'org.apache.flink.table.delegation.ExecutorFactory'.The following properties are requested:class-name=org.apache.flink.table.executor.StreamExecutorFactorystreaming-mode=trueThe following factories have been considered:org.apache.flink.streaming.connectors.kafka.Kafka010TableSourceSinkFactoryorg.apache.flink.streaming.connectors.kafka.Kafka011TableSourceSinkFactoryorg.apache.flink.streaming.connectors.kafka.Kafka08TableSourceSinkFactoryorg.apache.flink.streaming.connectors.kafka.Kafka09TableSourceSinkFactoryorg.apache.flink.streaming.connectors.kafka.KafkaTableSourceSinkFactoryorg.apache.flink.table.catalog.GenericInMemoryCatalogFactoryorg.apache.flink.table.sources.CsvBatchTableSourceFactoryorg.apache.flink.table.sources.CsvAppendTableSourceFactoryorg.apache.flink.table.sinks.CsvBatchTableSinkFactoryorg.apache.flink.table.sinks.CsvAppendTableSinkFactoryorg.apache.flink.table.module.CoreModuleFactory at org.apache.flink.table.factories.TableFactoryService.filterByFactoryClass(TableFactoryService.java:238) at org.apache.flink.table.factories.TableFactoryService.filter(TableFactoryService.java:185) at org.apache.flink.table.factories.TableFactoryService.findAllInternal(TableFactoryService.java:171) at org.apache.flink.table.factories.TableFactoryService.findAll(TableFactoryService.java:125) at org.apache.flink.table.factories.ComponentFactoryService.find(ComponentFactoryService.java:48) at org.apache.flink.table.api.java.internal.StreamTableEnvironmentImpl.lookupExecutor(StreamTableEnvironmentImpl.java:143)
-
【功能模块】arm系统【操作步骤&问题现象】问题描述:我们在三台arm机器上安装了zookeeper集群(3.5.5版本),共三个节点,运行一段时间后(3小时-3天),三台中一台zookeeper节点不响应请求了(ruok、stat等请求),使用zkCli去连接也连接失败,但是进程是存活的,端口也处于监听状态。排查过程:通过远程debug去查看问题原因,发现zookeeper的执行请求的线程池中堆积了大量等待执行的任务,但是没有线程来取任务。持续观察了半个小时,等待队列中的任务数量在持续增加,但是completed tasks数量一直不增加,如下所示:java.util.concurrent.ThreadPoolExecutor@2afba2ee[Running, pool size = 128, active threads = 0, queued tasks = 903, completed tasks = 7468631]java.util.concurrent.ThreadPoolExecutor@2afba2ee[Running, pool size = 128, active threads = 0, queued tasks = 918, completed tasks = 7468631]java.util.concurrent.ThreadPoolExecutor@2afba2ee[Running, pool size = 128, active threads = 0, queued tasks = 1042, completed tasks = 7468631]线程池中的线程的jstack如下"NIOWorkerThread-105" #146 daemon prio=5 os_prio=0 tid=0x0000fffeb409c800 nid=0x463a waiting on condition [0x0000fffd944fe000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000c0028cc0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)一直处于WAITING状态,该状态是 LinkedBlockingQueue中没有对象时会调用 Condition.await进入WAITING状态,但是当有对象进入队列时应当会调用Condition.signal唤醒,目前的问题是Condition.signal并没有唤醒我们初步怀疑是和glibc有关系,想咨询一下是否有人遇到过该问题?环境信息:系统 centos7-7.6.1810(AltArch)内核版本 Linux 4.14.0-115.el7a.0.1.aarch64 aarch64glibc版本 glibc-2.17-260.el7.aarch64jdk版本 1.8.0_241
-
各层命名规约:A) Service/DAO 层方法命名规约1) 获取单个对象的方法用 get 做前缀。2) 获取多个对象的方法用 list 做前缀。3) 获取统计值的方法用 count 做前缀。4) 插入的方法用 save/insert 做前缀。5) 删除的方法用 remove/delete 做前缀。6) 修改的方法用 update 做前缀。B) 领域模型命名规约1) 数据对象:xxxDO,xxx 即为数据表名。2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。3) 展示对象:xxxVO,xxx 一般为网页名称。 4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。
-
偶然发现一款基于java语言来构造测试数据的工具,给大家做下分享一、 打开 IntelliJ IDEA,创建一个maven项目,配置pom.xml文件如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.huawei.data.demo</groupId> <artifactId>generate-data</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.github.javafaker</groupId> <artifactId>javafaker</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency> </dependencies> </project>二、创建一个POJO类,定义属性如下,注意这里使用了lombok插件@Data public class UserInfo { private String realName; private String cellPhone; private String universityName; private String city; private String street; @Override public String toString() { return realName + "," + cellPhone + "," + universityName + "," + city + "," + street + "\n"; } }三、创建生成测试数据的测试类public class GenerateData { public static void main(String[] args) throws Exception { FileOutputStream outputStream = new FileOutputStream("test.txt",true); Faker fakerWithCN = new Faker(Locale.CHINA); for (int i=0; i<10;i++){ UserInfo userInfo = new UserInfo(); userInfo.setRealName(fakerWithCN.name().fullName()); userInfo.setCellPhone(fakerWithCN.phoneNumber().cellPhone()); userInfo.setCity(fakerWithCN.address().city()); userInfo.setStreet(fakerWithCN.address().streetAddress()); userInfo.setUniversityName(fakerWithCN.university().name()); System.out.println(userInfo.toString()); outputStream.write(userInfo.toString().getBytes(StandardCharsets.UTF_8)); } outputStream.close(); } }执行后,查看生成的测试数据文件 test.txt中如下更多javafaker支持的数据分类,可查看 http://dius.github.io/java-faker/apidocs/index.html
-
【功能模块】lxc容器中调试java程序报错【操作步骤&问题现象】1、容器中加载了java环境,登陆容器后执行 java -version 是ok的没有问题;2、但用命令启动程序时,报out of memoryAborted错误;java -Xms64m -Xmx256m -jar accnode-drive-core.jar【截图信息】这是容器的资源情况这个是错误信息
-
2020-12-28:java中,生产环境服务器变慢,如何诊断处理?#福大大架构师每日一题#
-
摘要:在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍Java垃圾收集的知识原理。java内存区域Q: Java虚拟机规范将JVM虚拟机所管理的内存分为几部分?如果是多选题,估计会给一些不在里面的,例如直接内存。A:程序计数器、java虚拟机栈、本地方法栈、方法区、堆。java对象在内存上的分配:§ GC策略Q:java使用根搜索算法来确定对象是否存货,哪些对象可以作为GC Roots?A:虚拟机栈(栈帧中的本地变量表)中的引用的对象方法区中的类静态属性引用的对象方法区中的常量引用的对象本地方法栈中JNI(Native方法)的引用对象Q: 标记清除、标记整理、复制算法哪个块?A: 复制算法较快。3个算法含义如下:Q: SerialOld用的是什么算法?A: 标记整理算法,属于处理老年代算法。各收集器的变化图如下,主要关注一下变化和区别,Q: fullGC 会发生在老年代区还是新生代区?A: 会发生在老年代区。 相反,minorGC一般发送在新生代区。新生代、老生代以及minorGC、fullGC的发生流程如下:Q: 方法区里的class对象(即类对象)什么时候会被回收?A: 所有实例都被回收、对应classLoader也被回收、class对象不会再被引用或者反射(这个咋确定?当初书里看到的,没懂)§ finalized与GCQ: 什么时候会调用对象的finalized方法A: JVM启动垃圾回收,且该对象要被回收时。finalized应该更多是规范吧,很多规范里都要求我们不要自己实现finalized了,毕竟不确定性太大。§ Java虚拟机GC参数配置突然想起来当初看java虚拟机时,把那些参数给跳过了,感觉记不住。但现在发现还是得学的,赶紧恶补一下。Q:-client和-server的对比()启动较快()性能和内存管理效率高(注意启动快和性能好不是一回事)桌面应用一般使用(), 服务器一般使用()A:(-clien)启动较快(-server)性能和内存管理效率高桌面应用一般使用(-clien), 服务器一般使用(-server)有4个跟内存相关的参数-Xmn -Xms -Xmx -Xss回答下面的问题:Q:用于配置java初始堆内存的是()A:-Xms。-X、memory、size ,内存大小Q:用于配置java堆的最大值的是()A:-Xmx。-X、memory、max最大内存Q:如果不设置,-Xms和-Xmx的大小分别默认是多少?A:不设置的话,二者相等,默认是 物理内存/64(小于1G)Q:用于配置新生代内存大小的最大值是:()你问我什么是新生代内存?就是下面这个,1个E区加2个S区的这个内存大小A:-Xmn。-X、memory、new相类似的还有-XX:NewSize 和 -XX:MaxNewSize。Q: 如何根据上面的参数计算老年代内存大小?A:Xmx的值(堆最大值)- Xmn的值(新生代内存)Q: 用于配置线程栈内存的是()? 替代的还有哪个参数?A:-Xss。 另一个是-XX:ThreadStackSize-Xss指 -X stack size有下面3个和gc相关的参数-Xnoclassgc -Xincgc -Xloggc:file回答以下问题:Q:可用于关闭针对类对象的gc功能的是()可用于减少gc的程序停顿时间的是()用于输出gc相关日志的是()A:可用于关闭针对类对象的gc功能的是(-Xnoclassgc)可用于减少gc的程序停顿时间的是(-Xincgc)用于输出gc相关日志的是(-Xloggc:file)Q:-verbose 一般是用于什么的?A:查询gc问题。-verbose:class 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。-verbose:gc 输出每次GC的相关情况,后面会有更详细的介绍。-verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息。Q: -XX:PermSize和-XX:MaxPermSize设置的是什么内存?A:方法区的内存。就是最开始那个图里的这个通过配置-XX:PermSize以及-XX:MaxPermSize来控制这块内存的大小,jvm在启动的时候会根据-XX:PermSize初始化分配一块连续的内存块,这样的话,如果-XX:PermSize设置过大,可能会很浪费。而Max如果设置小了,可能会omm。Q:-XX:MetaspaceSize和-XX:MaxMetaspaceSize又是什么内存?A:元数据区内存。 java8引入的,用于替代上面的perm区。无论-XX:MetaspaceSize和-XX:MaxMetaspaceSize两个参数如何设置,随着类加载越来越多不断扩容调整,直到MetaspaceSize(如果没有配置就是默认20.8m)触发FGC,上限是-XX:MaxMetaspaceSize,默认是几乎无穷大本文分享自《Java云服务开发知识学习之 java垃圾收集》,原文作者:breakDraw 。
-
问题描述用户开启了SSL验证连接功能,使用代码执行SQL连接数据库出现如下报错:故障分析用户开启了SSL连接功能,只能使用SSL连接方式,不能使用普通连接方式。解决方案开启SSL验证连接功能,使用SSL连接方式连接数据库,请参考SSL连接方式。关闭SSL验证连接功能,使用普通连接方式连接数据库,请参考普通连接方式。
-
请问华为的app engine是基于模型驱动架构(MDA)而设计和开发的吗?是基于JAVA系的MDA吗?
-
摘要:一问一答的形式轻松学习掌握java工具。以一问一答的形式学习java工具Q:检查内存泄露的工具有?A: jmap生成dump转储文件,jhat可视化查看。Q:某进程CPU使用率一直占满,用什么工具可以排查?A:top -Hp pid找到最占CPU的线程然后jstack来查找那个线程此时所处的堆栈,确定问题发生位置。§ 各工具详细介绍§ jstack全称: JVM Stack Trance作用: 查看某个java进程的堆栈情况, 可用于确认死锁、IO等待、死循环等问题。命令用法:jstack pid查看死锁例子如下图,找到wait的lock和已被锁的lock 查看等待IO例子:§ jstat全称:作用:查看进程中内存使用情况,但只能给出一些简单统计数据统计加载了多少类以及占用空间 jstat -class pid统计编译了多少文件 jstat -compiler 10Q: jstat -gcutil {pid} 2000 可以每隔2秒,对pid进程打印内存使用统计信息。gcutil的输出如下里面哪个百分比如果长期处于99%-100%会有OMM风险?(OutOfMemoryError)A:如果E和O即新生代、老年代内存区一直都处于满的状态,则很有可能会引发OMM风险。就像下面这个。§ jmap全称: JVM Memory Map作用:生成进程的内存堆快照当需要看一下进程里是什么东西占用了过多内存时, 可以用jmap打印一下堆快照。命令用法:打印堆快照: jmap -dump:file=./dumpfile.dump 进程pid查看特定类所占用的情况: jmap -histo:live 进程pid | grep 类名Q: 用jmap检查内存泄漏实例我分了3次,每个1h调用jmap查看进程的内存实例,查看该时刻各对象数量第一次查看情况如下:第二次隔了2各小时,查看情况如下:请问哪个对象可能有内存泄漏风险?A:ObjectA可能有泄露, 因为他的对象数量增加最快,说明对象一直在增加且很多无法进行gc释放。§ jhat全称: JVM Heap Analysis Tool和jmap配合, 可以解析jmap生成的堆快照, 支持生成1个web进程供我们分析和查看。命令用法:jhat -J-Xmx515M dumpfile.dump此时就会启动1个webServer,然后我们去访问就行了§ jdb全称:Java Debugger作用:用来对core文件和正在运行的Java进程进行实时地调试,类似于c++里的gdb常见用法:启动进程并调试: jdb -classpath . Test至二级调试某进程: jdb -attach 8000 -sourcepath /Users/wefit/Development/study/java/jtest/src/§ jcmd作用:多功能的工具,可以用它来导出堆、查看Java进程、导出线程信息、执行GC、还可以进行采样分析,可以理解为1个性能调优时用的工具。常见命令:查看 当前机器上所有的 jvm 进程信息: jcmd -l查看指定进程的性能统计信息: jcmd pid PerfCounter.print列出当前运行的 java 进程可以执行的操作: jcmd PID help查看线程堆栈信息: jcmd PID Thread.print查看堆内存信息: jcmd PID GC.heap_dump FILE_NAME§ jps简单记法: JVM process status全名:Java Virtual Machine Process Status Tool作用: 显示 当前系统用户 的 所有 Java进程情况及其进程号常用命令:查看进程jvm参数: jps -v输出程序main class的完整package名或程序的jar文件完整路径名: jps -l输出传递给main方法的参数: jps -m§ jinfojvm infomation作用:和jps功能类似, 但是支持根据指定pis查看指定进程可以查看JVM参数、系统参数、调整jvm参数但不支持查看java程序的内存使用情况§ javap把java字节码文件反汇编为Java源码文件。§ javacjava编译工具javac的执行过程:
-
2020-12-18:java和go,并发控制有哪几种方式?#福大大架构师每日一题#
-
2020-12-17:java和go,如何高效的拼接字符串?#福大大架构师每日一题#
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签