多线程和锁

1.创建线程资源使用线程池,原因:线程池能减少创建和销毁线程所消耗的时间和系统开销,解决系统资源不足的问题

2.线程池通过ThreadPoolExecutor,规避了资源耗尽

3.多线程创建的方式

继承Thread类

实现Runnable接口

线程池

Callable + FutureTask

CompletableFuture

Fork Join

并行计算

Timer定时任务

Spring异步方法调用

4.线程状态

NEW:新建,未启动

RUNNABLE:就绪,已启动,等待cpu时间片

RUNNING:运行,正在执行

BLOCKED:阻塞,遇到synchronized未得到锁

WAITING:等待,执行了wait(),需要被notify()或notifyAll()唤醒

notify():随机唤醒一个等待的线程

notifyAll():唤醒所有等待的线程

TIMED_WAITING:限时等待,调用了Thread.sleep()或wait,设置了时间

TERMINATED:结束

5.虚假唤醒

两个以上的线程会造成虚假唤醒,即没有使用notify(),线程自己苏醒自动执行任务,使用While循环解决

6.锁

多个线程申请锁,某个线程得到锁之后,在对象监视器上留下记录,等到该线程执行完,要释放锁时,清除在对象监视器上留下的记录,然后释放锁。

对象监视器(ObjectMonitor)是c++开发的

7.synchronized字节码指令

加锁:monitorenter

解锁:monitorexit

8.锁膨胀机制(jdk1.6引入,目的:如果只有一个线程,则没有锁的竞争,不需要加锁、解锁,节约操作时间)

无锁:没有线程申请锁

偏向锁:只有一个线程,并且是同一线程申请锁

轻量级锁:只有一个线程,但是是不同线程申请锁

重量级锁:多个线程申请锁

锁膨胀不可逆

9.对象结构

对象头:对象运行时信息

对象体:对象本身的属性数据

对齐字节:填充数据,8字节的整数倍

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,线程是一种用于保护共享资源的同步机制,可以确保同一时刻只有一个线程访问共享资源,避免多个线程同时修改数据而导致数据不一致的问题。下面是一个使用线程的示例: ```python import threading # 定义一个共享资源,初始值为0 shared_resource = 0 # 定义一个线程 lock = threading.Lock() # 定义一个线程函数,用于修改共享资源的值 def update_shared_resource(): global shared_resource # 获取线程 lock.acquire() # 修改共享资源的值 shared_resource += 1 # 释放线程 lock.release() # 创建多个线程,同时访问共享资源 threads = [] for i in range(10): thread = threading.Thread(target=update_shared_resource) threads.append(thread) # 启动多个线程 for thread in threads: thread.start() # 等待所有线程执行完毕 for thread in threads: thread.join() # 输出共享资源的最终值 print("Shared resource: ", shared_resource) ``` 在上面的示例中,定义了一个共享资源`shared_resource`和一个线程`lock`。在`update_shared_resource()`函数中,先获取线程,然后修改共享资源的值,最后释放线程。在创建多个线程时,每个线程都会调用`update_shared_resource()`函数来修改共享资源的值,但是由于使用了线程,每次只有一个线程能够获得线程并修改共享资源的值,其他线程需要等待线程释放才能继续执行。 注意,获取线程后,需要在适当的时候释放线程,否则会导致死等问题。在上面的示例中,使用了`lock.acquire()`获取线程,并在`lock.release()`处释放线程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值