Blog

patience is the key in life


以下解决办法参考自网友们的分享

1. JDK绑定问题


但其实这样也没有问题,因为内嵌的jdk版本与当前的es版本是适配的

但是,如果内嵌的jdk与当前es不适配,那就要修改配置文件 / 添加环境变量,让es启动的时候能扫描到我们本地的jdk

  1. 添加环境变量

  1. 修改配置文件

2. SSL问题

输入localhost:9200后,报错

查看报错信息,发现需要同服务端建立https连接

这里有两个解决办法。

  1. 通过带https前缀的url去访问


需要登录,但这里用户名和密码不知道,有说是<elastic,changeme>的,但试过发现不正确

于是尝试重新设置用户名和密码

但是报错
(插个眼,先放一边,回头再找解决办法。。)

  1. 关闭安全措施

    可以正常访问,不再报错

感谢将遇到的问题的解决方案分享出来的朋友们!

希望这篇文章能对你有所帮助~


  1. 客户端首先和MySQL服务器建立连接
  2. 建立连接后将MySQL语句发送给服务器
  3. 解析器首先对语句进行解析(词法、语法分析)
  4. 解析完成后交由预处理器进行预处理操作
    1. 判断查询语句的表和字段是否存在
    2. 将select * 拓展成查询全列(select id,…)的语句
  5. 然后交由优化器给出执行方案
  6. 最后交给执行器执行
  7. 执行器通过调用存储引擎提供的API接口进行数据的存取

1.安装kafka之前需要先完成zookeeper的安装

【zookeeper】安装

2. Apache Kafka官网下载

3. 解压完成后修改server.properties配置文件


修改日志文件存放路径

查看与zookeeper连接的端口是否和zookeeper服务所在的端口一致
(这里默认是2181,如果zookeeper启动端口没有修改,这里也无需变更

4.启动kafka

1
bin\windows\kafka-server-start.bat config\server.properties

如下,则表示启动成功

至此,kafka安装启动结束

安装过程中遇到过许多问题,感谢将这些问题解决过程分享出来的同路人们!

希望这篇文章能帮到你~

1. Apache Zookeeper官网下载


2. 解压后创建log和data文件夹

这个其实不一定要建在zookeeper文件夹下,建在任意一个文件夹里都行,只要配置文件中的路径配置能找到就行

3. 修改配置文件



这里要注意!!!
win系统下路径分隔符用

/

有点疑问:为什么win系统磁盘中文件的绝对路径的分隔符是\,但在配置文件中文件路径的分隔符要用/?

查询后得出结论:

在Windows操作系统中,文件路径的绝对路径分隔符是反斜杠\,这是因为反斜杠在Windows系统中被用作文件路径分隔符的标准约定。例如,C:\Users\Admin\Desktop\file.txt 是Windows系统中文件的绝对路径表示方式。
而在配置文件中,特别是在类Unix系统(如Linux、MacOS等)中,文件路径的分隔符是正斜杠/。这是因为Unix系统中的路径分隔符是正斜杠,而且正斜杠在配置文件中通常用作路径分隔符的约定。所以,即使在Windows系统中使用的是反斜杠作为文件路径分隔符,但在配置文件中为了与Unix系统的约定保持一致,通常会使用正斜杠作为文件路径分隔符
因此,为了确保在不同操作系统和不同环境下都能正确解析文件路径,通常会建议在配置文件中使用正斜杠/作为文件路径的分隔符。这样可以避免在不同系统下出现路径解析错误的情况,保证程序的可移植性和通用性。

4.启动zookeeper

  1. zkServer.cmd正常启动如下

    如遇闪退,可以在zkServer.cmd文件末尾加上pause,以便查看报错原因
  2. zkCli.cmd正常启动如下

    至此,zookeeper启动成功

安装过程中遇到过许多问题,感谢将这些问题解决过程分享出来的同路人们!

希望这篇文章能帮到你~

volitile关键字用于解决多线程并发执行时可能出现的可见性问题

缓存锁定

处理器在对已经加载到cache当中的共享数据进行修改时,会向总线发出命令,其他处理器通过嗅探总线发现有处理器请求写内存地址,而该内存地址为共享地址,处理器就会使存有该共享内存地址的cache行失效。处理器修改完共享数据后,会将结果写回内存。这样,其他处理器下次对共享数据的操作就会先从主存当中读取该数据到cache中,然后再进行处理,这样得到的就是最新的数据,避免了可见性问题。

根据书中所写,对加了volatile关键字的变量进行读写操作时,生成的汇编代码前会加上lock。


于是,我写了这样一段demo

1
2
3
4
5
6
7
8
9
10
11
12
13
public class test {
static volatile int temp = 10;
public static void main(String[] args) {
temp++;
Goods bottle = new Goods();
bottle.price++;
}
}

class Goods{
volatile int price = 0;
Goods(){}
}

然后通过javac以及javap命令在终端查看它编译后的汇编代码

1
2
3
javac -g:none -d out src/test.java
javap -c -v -p out/test.class > out/test.asm

得到的汇编文件中关键代码部分如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{
static volatile int temp;
descriptor: I
flags: (0x0048) ACC_STATIC, ACC_VOLATILE

public test();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=2, args_size=1
0: getstatic #7 // Field temp:I
3: iconst_1
4: iadd
5: putstatic #7 // Field temp:I
8: new #13 // class Goods
11: dup
12: invokespecial #15 // Method Goods."<init>":()V
15: astore_1
16: aload_1
17: dup
18: getfield #16 // Field Goods.price:I
21: iconst_1
22: iadd
23: putfield #16 // Field Goods.price:I
26: return

static {};
descriptor: ()V
flags: (0x0008) ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: bipush 10
2: putstatic #7 // Field temp:I
5: return
}

没有找到带有lock前缀的汇编指令,于是我去求助了一下gpt,得到的解答如下
当你查看 Java 代码编译后的汇编代码时,如果发现加了 volatile 的变量对应的汇编语句没有出现 lock 前缀,可能有以下几个原因:

  1. 编译器优化:编译器在生成汇编代码时可能会进行优化,将 volatile 变量的读写操作优化为更高效的方式,而不是简单地添加 lock 前缀。
  2. 硬件层面支持:某些处理器对 volatile 变量的操作可能有硬件层面的支持,因此在汇编代码中不需要显式添加 lock。
  3. 汇编代码层面隐藏:lock 前缀可能被隐藏在汇编代码的更底层的指令中,不一定会直接出现在你查看的汇编代码中。

创建线程

创建线程主要通过继承类和实现接口来完成

继承Thread类

需要重写Thread类中的run()方法

实现Runnable接口

需要实现接口中的run()方法

实现Callable接口

需要实现接口中的call()方法,通过这种方式创建的线程,可以有返回值

启动线程

通过start()方法启动线程
阅读start()源码,探究一下底层实现



再看看start0()做了些啥



start0()是被native修饰的方法,说明它是由外部语言(C/C++)来实现的,而不是通过JVM虚拟机来执行
所以,那具体做了啥呢?
(未完,待定)


与操作系统线程的状态定义不同,Java线程中的状态有6种,各自对应不同的操作系统中的线程状态

NEW

调用start()方法之前,对应于操作系统线程的启动态

RUNNABLE

调用start()方法之后,对应于操作系统线程的就绪态/运行态

BLOCKED

线程请求资源未能得到满足,对应于操作系统线程的阻塞态

WAITING

调用Thread.wait(),Thread.join()方法之后,对应于操作系统线程的挂起态
需要有其他线程来唤醒它

TIME-WAITING

调用Thread.sleep(long millis)、Thread.join(long millis)方法之后,对应于操作系统线程的挂起态
可以自动唤醒

TERMINATED

0%