线程非安全

from threading import Thread
from threading import Lock

g_num =  0

def work1():
    global g_num
    for i in range(1000000):
        mutex.acquire()#加锁
        g_num+=1
        mutex.release()#解锁

def work2():
    global g_num
    for i in range(1000000):
        mutex.acquire()#加锁
        g_num+=1
        mutex.release()#解锁

mutex = Lock()#创建锁

if __name__ == '__main__':
    # work1()
    # work2()
    # print('g_num:',g_num)#2000000

    t1 = Thread(target=work1)
    t2 = Thread(target=work2)
    t1.start()
    t2.start()

    t1.join()
    t2.join()
    print('g_num:', g_num)

### Spring Boot 方法线程安全性分析 在多线程环境中,Spring Boot 应用程序中的方法默认情况下并不是线程安全的。这是因为多个请求可能会并发访问同一个实例的方法,在这种场景下共享资源如果没有妥善管理,则可能导致数据竞争和其他同步问题[^2]。 对于被 `@Scheduled` 注解标记的方法来说,虽然 Spring 负责按照配置的时间间隔调用它们,但如果这些方法内部操作了可变状态或是依赖于某些外部线程安全的服务或对象时,同样可能遇到线程安全方面的问题[^1]。 为了确保定时任务或其他服务层逻辑在线程间的正确执行,有几种常见做法来增强其线程安全性: #### 使用不可变对象 创建只读的数据结构或者使类成员成为 final 类型,这样可以减少由于变量修改带来的不确定性,从而提高代码的安全性和稳定性。 #### 同步机制 当确实需要改变一些共享的状态时,可以通过 synchronized 关键字或者其他更细粒度锁如 ReentrantLock 来控制对临界区(Critical Section)的操作,防止不同线程间相互干扰。 ```java public class MyService { private final Object lock = new Object(); @Scheduled(fixedRate = 5000) public void scheduledTask() { synchronized (lock) { // Critical section code here... } } } ``` #### 并发工具包的应用 Java 提供了一系列专门设计用来支持高并发编程的功能库,比如 ConcurrentHashMap, CopyOnWriteArrayList 等容器类型可以直接替代传统的 HashMap 或 ArrayList ,以提供更好的性能和更高的线程安全保障;还可以利用原子类(AtomicInteger, AtomicLong 等),它们提供了无锁的方式来进行数值更新。 #### 避免共享状态 尽可能让每个 HTTP 请求都拥有独立的工作副本而不是全局单例模式下的静态字段或者是其他形式上的跨请求共享存储空间。通过这种方式能够有效降低因竞态条件而引发的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值