Fork me on GitHub

String引用传值问题

     Java 中是没有引用传递的,Java 中只有值传递。Java 中所谓的引用传递,也只是传递了”引用变量保存的地址值”。 Java 中判断”引用传递”有没有达到你预期的效果,前提要基于内存模型,并结合你的上下文,根据有没有利用引用变量”传递”的这个地址值去修改实际内存对象的数据来判断。

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package edu.zjnu;

/**
* @author 杨海波
* @date 2024/2/29 20:49
* @description String 引用传值
*/
public class Main {

public static void main(String[] args) {
test01();
test02();
}

private static void test01() {
String str = "out";
// str = "out2";
f01(str);
System.out.println(str);
}

/**
* 工程实践表明,java 中没有引用传递,只有值传递。
* <p>
* Java 中所谓的引用传递,也只是传递了"引用变量保存的地址值",如果无法做到
* 根据这个引用指向的地址去修改实际对象的值,那么函数外部的实际对象无法被修改。
* 特别的,String 是不可变对象:
* 在 test01 这个例子中, 外部的 ' str = "out2"; 这行代码只是在方法区的
* 字符串常量池新建了一个字符串常量对象 "out2",并将该对象的地址赋值给引用变
* 量 str。内部的 str = "in"; 也是同理,但是当 f01 函数执行 str = "in";
* 这行代码时,引用变量保存的值(该值是尊从值传递的)是新的字符串常量对象 "in"
* 的地址,当 f01 执行完毕,这个值尊从函数作用域规则消失了。
*
* @param str
*/
private static void f01(String str) {
str = "in";
}


/**
* 解决办法如下
*/
private static void test02() {
StringWrapper str = new StringWrapper("out");
f02(str);
System.out.println(str.value);
}

private static void f02(StringWrapper str) {
str.value = "in";
}


static class StringWrapper {
// 实际值
public String value;

public StringWrapper(String value) {
this.value = value;
}
}
}

云原生之于服务端开发

     每个服务端开发人员都应该了解云原生。云原生视角,是一个全栈的服务端视角—自下而上从硬件设备到应用架构。在云原生视角下回过头来看服务端开发的问题,有点降维打击的感觉。现在看服务端开发的问题,再复杂的问题,也只是局部的一个点,很小的问题。

一个内心强大的人都经历过什么

进程间通信的5种方式

以下是类UNIX操作系统(如Linux)中常见的5种通讯机制。

进程间通信的5种方式

     管道(Pipes):管道是指连接两个或多个进程的输入和输出,常用于流式传输数据。例如,shell脚本通常使用管道运算符“|” 将命令链接在一起:

1
cat /var/log/syslog | grep 'error' | less

     消息队列(Message Queues):消息队列通过允许进程以消息的形式交换数据来提供异步通信。写入队列的消息按先进先出的顺序处理。

例如,服务器可能将作业分派到队列中,消费守护进程从中拉取并独立处理。

     信号(Signals):信号提供了一种通知系统,能够让进程立即收到重要事件,如被强制终止。例如,SIGKILL提供了一种可靠的方法来结束无响应的应用程序。

     信号量(Semaphores):信号量是是一种在多线程环境中使用的同步机制,旨在确保多个线程不会同时访问同一块共享内存区域或其他临界资源。

     共享内存(Shared Memory):共享内存是允许直接访问共享内存区域,以便多个进程可以高效地读取和修改数据,而无需复制。一个示例用例是处理大型图像帧的程序,其中多个进程可以同时访问和处理图像的不同部分。

     这些IPC机制有时被组合在一起以实现高效的进程通信。

HTTPS是如何工作的

     超文本传输协议安全(HTTPS)是超文本传输协议(HTTP)的扩展。

     HTTPS使用传输层安全协议(TLS)来传输加密数据。如果数据在网上被劫持,劫持者得到的只是二进制代码。那么数据是如何加密和解密的呢?

HTTPS是如何工作的

  • 步骤1 - 客户端(浏览器)和服务器建立TCP连接。

  • 步骤2 - 客户端向服务器发送“客户端hello”。该消息包含一组必要的加密算法(密码套件)以及它可以支持的最新TLS版本。服务器通过发送“服务器hello”来响应,以便浏览器知道它是否支持算法和TLS版本。服务器然后向客户端发送SSL证书。证书包含公钥、主机名、过期日期等。客户端验证证书。

  • 步骤3 - 在验证SSL证书后,客户端生成会话密钥并使用公钥对其进行加密。服务器接收加密的会话密钥并使用私钥进行解密。

  • 步骤4 - 现在客户端和服务器都持有相同的会话密钥(对称加密),加密数据通过安全的双向通道进行传输。

     为什么HTTPS在数据传输期间会切换到对称加密?主要有两个原因:

  • 1、安全:非对称加密只适用于单向。这意味着如果服务器尝试将加密数据发送回客户端,任何人都可以使用公钥解密数据。

  • 2、服务器资源:非对称加密增加了大量的数学开销。它不适合长会话中的数据传输。

强者思维,极简主义

强者思维:你根本不用害怕任何人

永远不要觉得尴尬和丢脸

  • Copyrights © 2023-2024 杨海波
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信