多线程之加锁问题

个人学习记录,大神勿笑


class Demo {

  sychronized void f(){}

  sychronized void g(){}

}

 

成员为什么要私有化:对于多线程并发而言,成员私有化可以减少肯能并发出现问题的入口,更安全,也比成员加锁更加高效

所有对象都自动含有单一锁,也叫监视器,当对象上任意的方法调用synchronized方法,此对象将会被加锁,并且此对象上所有添加synchronized方法将不能被其他线程执行(普通方法可以被执行),即当f()被一个线程调动还未释放锁时候,其他线程不仅仅不能调用f()方法,而且不能调用g()方法,,即此时对象所得其实是对象内存代码,其实对于某一个特定的对象而言,共享的是同一个锁.

我们只需要也必须要对所有处理临界数据的方法全部加锁,但是调用其他方法将会毫无惩罚性的被正常调用

jvm会统计对象被加锁的次数,只有首个获取对象锁的任务才能再次调用synchronized方法,并且计数会加1,没退出一个snychronized计数会减一.当计数为0就被彻底释放

针对每个类也有一个锁,作为class对象的一部分,所以synchronized static 方法可以在类的范围内保证static数据的并发访问,所以饿汉式的单例模式可以保证线程安全,其实这是有jvm保证的线程安全.

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
多线程环境下使用 `std::map`,需要注意线程安全问题。由于 `std::map` 是 STL 中的容器,它并不是线程安全的,因此在多线程环境下使用时需要注意加锁。在对 `std::map` 进行读写操作时,必须保证同一时间只有一个线程在进行操作,否则会出现数据竞争问题,导致程序崩溃或数据错误。 一种解决方案是使用互斥锁来保证线程安全,即在对 `std::map` 进行操作前先锁定互斥锁,操作完成后再释放互斥锁。示例代码如下: ```c++ #include <map> #include <mutex> std::map<int, int> myMap; std::mutex myMutex; void writeData(int key, int value) { std::lock_guard<std::mutex> lock(myMutex); // 加锁 myMap[key] = value; // 写入数据 } int readData(int key) { std::lock_guard<std::mutex> lock(myMutex); // 加锁 return myMap[key]; // 读取数据 } ``` 在上述代码中,我们使用了 `std::mutex` 类型的互斥锁来保证线程安全,通过 `std::lock_guard` 类型的锁保证在执行操作时自动加锁和解锁。这种方法能够保证线程安全,但是由于每次读写操作都需要加锁和解锁,因此会带来一定的性能损失。 另一种解决方案是使用读写锁,即读锁和写锁。在读操作时加读锁,多个线程可以同时读取数据,但在写操作时加写锁,只允许一个线程进行写操作。这种方法能够提高程序的性能,但需要注意避免死锁问题。示例代码如下: ```c++ #include <map> #include <shared_mutex> std::map<int, int> myMap; std::shared_mutex myMutex; void writeData(int key, int value) { std::unique_lock<std::shared_mutex> lock(myMutex); // 加写锁 myMap[key] = value; // 写入数据 } int readData(int key) { std::shared_lock<std::shared_mutex> lock(myMutex); // 加读锁 return myMap[key]; // 读取数据 } ``` 在上述代码中,我们使用了 `std::shared_mutex` 类型的读写锁来保证线程安全,通过 `std::unique_lock` 类型的写锁和 `std::shared_lock` 类型的读锁保证在执行操作时自动加锁和解锁。这种方法能够提高程序的性能,但需要注意避免死锁问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁月玲珑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值