多个线程访问同一个类里面的静态成员变量

本文讨论了在Java中,当多个线程如product1, product2, product3尝试访问和修改同一类内的静态成员变量count时,由于静态变量的全局共享性质,需要使用锁机制来确保并发安全。" 121346177,8564630,SQL查询:获取每个用户的最新三笔订单,['mysql'],"['SQL', '查询', '订单', '最新', '三笔', '用户', '排序', '限制', '表', 'Customers', 'Orders']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如下所示,product1, product2,product3是三个不同的线程,但由于Producer类里面的成员变量count是静态变量,

所以实际上count是三个线程的共享成员变量,对其进行操作时,最好加上锁访问机制。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

public class BlockingQueueTest {

	public static void main(String[] args) throws InterruptedException {
		// 声明一个容量为10的缓存队列
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>(10);

		Producer producer1 = new Producer(queue, 1);
		Producer producer2 = new Producer(queue, 2);
		Producer producer3 = new Producer(queue, 3);
		Consumer consumer = new Consumer(queue);

		// 借助Executors
		ExecutorService service = Executors.newCachedThreadPool();
		// 启动线程
		service.execute(producer1);
		service.execute(producer2);
		service.execute(producer3);
		// service.execute(consumer);

		// 执行10s
		Thread.sleep(10 * 1000);
		producer1.stop();
### 静态成员函数访问静态成员变量的实现方法 在C++中,静态成员函数无法直接访问的非静态成员变量,因为静态成员函数属于本身而非具体的对象实例,因此它没有隐式的 `this` 指针。然而,可以通过显式地传递对象指针或引用的方式,使静态成员函数间接访问静态成员变量。 以下是几种常见的实现方式: #### 方法一:通过显式传递对象指针 静态成员函数可以通过接受一个指向对象的指针作为参数,从而间接访问该对象的非静态成员变量。 ```cpp class MyClass { public: static void StaticFunction(MyClass* obj) { cout << "Non-static member variable: " << obj->nonStaticMember << endl; } private: int nonStaticMember = 42; }; int main() { MyClass obj; MyClass::StaticFunction(&obj); // 传递对象指针 return 0; } ``` 此方法中,静态成员函数 `StaticFunction` 接收了一个指向 `MyClass` 对象的指针,并通过该指针访问了非静态成员变量 `nonStaticMember`[^1]。 --- #### 方法二:通过显式传递对象引用 与方法一似,可以传递对象的引用而非指针,代码更加简洁。 ```cpp class MyClass { public: static void StaticFunction(MyClass& obj) { cout << "Non-static member variable: " << obj.nonStaticMember << endl; } private: int nonStaticMember = 42; }; int main() { MyClass obj; MyClass::StaticFunction(obj); // 传递对象引用 return 0; } ``` 在此方法中,静态成员函数 `StaticFunction` 接收了一个 `MyClass` 对象的引用,并通过该引用来访问静态成员变量 `nonStaticMember`[^2]。 --- #### 方法三:通过全局变量静态成员变量存储对象指针 如果需要频繁访问某个特定对象的非静态成员变量,可以将该对象的指针存储为全局变量静态成员变量,然后在静态成员函数中使用该指针。 ```cpp class MyClass { public: static void StaticFunction() { if (instance != nullptr) { cout << "Non-static member variable: " << instance->nonStaticMember << endl; } } static void SetInstance(MyClass* obj) { instance = obj; } private: int nonStaticMember = 42; static MyClass* instance; }; MyClass* MyClass::instance = nullptr; int main() { MyClass obj; MyClass::SetInstance(&obj); MyClass::StaticFunction(); // 使用全局静态指针访问静态成员变量 return 0; } ``` 此方法中,静态成员变量 `instance` 存储了一个指向 `MyClass` 对象的指针,静态成员函数 `StaticFunction` 通过该指针访问静态成员变量 `nonStaticMember`[^3]。 --- #### 方法四:通过回调函数机制 在某些场景下,可以通过回调函数的方式让非静态成员函数处理数据,而静态成员函数仅负责调用这些非静态成员函数。 ```cpp class MyClass { public: static void StaticFunction(MyClass* obj, int data) { obj->ProcessData(data); // 调用非静态成员函数 } void ProcessData(int data) { nonStaticMember = data; cout << "Updated non-static member variable: " << nonStaticMember << endl; } private: int nonStaticMember = 0; }; int main() { MyClass obj; MyClass::StaticFunction(&obj, 42); // 通过静态函数调用非静态成员函数 return 0; } ``` 此方法中,静态成员函数 `StaticFunction` 接收了一个指向 `MyClass` 对象的指针和数据参数,并通过该指针调用了非静态成员函数 `ProcessData` 来更新非静态成员变量 `nonStaticMember`[^4]。 --- ### 注意事项 - 静态成员函数无法直接访问静态成员变量,必须通过显式传递对象指针或引用的方式。 - 如果需要频繁访问某个特定对象的非静态成员变量,可以考虑使用全局变量静态成员变量存储该对象的指针。 - 在多线程环境中,需注意对象指针的有效性和线程安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值