扫码关注官方订阅号
最近从PHP转到了JAVA。 但是一直迷惑一个问题。就是JAVA 为什么会有连接池这个概念呢? PHP的运行方式是从脚本开始到脚本结束,脚本结束,对象自动就没了。java是如何运行的呢?java难道是不同线程调用的还是同一个对象,那不就乱了??不同用户来,怎么区别谁是谁的对象??我都搞晕了。现在我都不敢new 对象了。
我只针对多线程方面的东西解释下。首先楼主可能需要理解,在 Java 中,什么样的对象是可以多个线程共享的,什么样的对象是不可以的。这个标准取决于对象的成员是否可以在线程之间共享。比如
public class A { public int value; }
显然,如果多个线程同时访问同一个 A 对象,就会有危险,因为它们会把 value 的值给“搞乱了”。而 A 类也被称为非线程安全的。不过,如果我改成这样:
public class A { private int value; // 1 public A(int value) {this.value = value;} // 2 public int getValue() {return this.value;} // 3 }
这样 A 就变成线程安全的了,为什么呢,因为它的成员 value 在(1)处变成私有的了,而且只能在构造函数(2)中赋值,且一旦赋值就只能读取(3),而读取是可以多个线程同时操作的。
所以,一个简单的原则就是,一个可赋值的成员会成为多线程中的隐患。如果一个类包含可赋值的成员,那么这个类的对象应该在线程当中独立存在,而不应该共享给多个线程同时访问,除非保证只有一个线程会去写。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
我只针对多线程方面的东西解释下。首先楼主可能需要理解,在 Java 中,什么样的对象是可以多个线程共享的,什么样的对象是不可以的。这个标准取决于对象的成员是否可以在线程之间共享。比如
显然,如果多个线程同时访问同一个 A 对象,就会有危险,因为它们会把 value 的值给“搞乱了”。而 A 类也被称为非线程安全的。不过,如果我改成这样:
这样 A 就变成线程安全的了,为什么呢,因为它的成员 value 在(1)处变成私有的了,而且只能在构造函数(2)中赋值,且一旦赋值就只能读取(3),而读取是可以多个线程同时操作的。
所以,一个简单的原则就是,一个可赋值的成员会成为多线程中的隐患。如果一个类包含可赋值的成员,那么这个类的对象应该在线程当中独立存在,而不应该共享给多个线程同时访问,除非保证只有一个线程会去写。