线程
1、线程的生命周期
2、线程的安全问题
因为线程在执行时,有随机性,CPU的执行权随时有可能被抢走。
解决方法:把操作共享的代码锁起来
3、同步代码块
把操作共享的代码锁起来
格式:
synchronized(锁){
操作共享数据的代码
}
特点1:锁默认打开,有一个线程进去了,锁自动关闭
特点2:里面的代码全部执行完毕,线程出来,锁自动打开
注意:锁对象一定要是唯一的,所以在定义的锁对象前加一个static静态关键字。
e.g static Object obj = new Object();
也可以直接把 当前类名.class作为锁对象,因为当前类名.class也是唯一的
4、同步方法
就是把synchronized关键字加到方法上,把方法的全部代码锁起来。
格式:
修饰符 synchronized 返回值类型 方法名(方法参数){...}
特点1:同步方法是锁住方法里面所有的代码
特点2:锁对象不能自己指定(非静态:this;静态:当前类的字节码文件对象)
补充:
将StringBuildder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。因为StringBuffer的方法是同步方法,而StringBuilder不是。
5、Lock锁
Lock lock = new ReentrantLock();
//加锁
lock.lock();
//释放锁
lock.unlock();
6、死锁
出现情景:有锁嵌套、
所以,我们在写锁的时候不要让两个锁嵌套起来。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗