Java多线程,线程的具体含义,共有资源,Synchronized锁类型及其应用场景

1.栈:

栈是线程运行时在JVM中开辟出来的一块内存空间,栈帧是在这个栈中运行的方法;

可以理解为线程调用的方法是存储在栈帧中,调度完之后会出栈,遵从先进后出的原则

2.共有资源是什么:

①如果这个资源是属于类本身的,即静态变量

那么就是类级资源,我们通过对象和类都可以调度这个资源

②如果这个资源是属于对象的,即非静态资源

属于对象的资源,我们一般是通过方法去对这个资源进行调度

注意:因为基本数据类型的形参是栈帧私有的,因此是不会出现多线程下的数据不一致问题

3.调度的方式是怎样的

我们使用多线程实现并发,实际上就是通过不同的线程对象,通过重写线程对象的run()方法,在run()方法中使用我们要调度的对象的方法去调度我们统一使用的资源,开启线程,进而实现多线程的操作

这一点有点拗口,后面会解析

4.不同的资源怎样加不同的锁

①. 非静态变量(实例级资源)→ 用this锁或 Object 锁

比喻:非静态变量 = “每个客户的私人银行卡”(每个对象实例对应一张独立的卡,卡号、余额都是该客户私有)。

  • 当多个线程操作同一个对象实例的非静态变量时:就像 “多个柜员给同一位客户的私人银行卡打钱”——this锁或 Object 锁会确保同一时间只有一个柜员操作这张卡(避免余额计算错误)。
  • 当多个线程操作不同对象实例的非静态变量时:就像 “多个柜员分别给不同客户的私人银行卡打钱”—— 每个客户的卡有自己的锁(this或 Object),柜员之间互不干扰(锁不冲突),因为操作的是完全独立的账户。

②. 静态变量(类级资源)→ 用Class锁

比喻:静态变量 = “银行总行的公共账户”(全行只有一个,所有分支、所有客户的操作最终都会影响这个总账户,比如 “全行总存款”)。当多个线程通过不同对象实例操作静态变量时:就像 “全国各分支银行的柜员,都在给总行的公共账户转账”—— 无论哪个分支(对象实例)的柜员操作,最终都要访问同一个总账户。锁会确保同一时间只有一个柜员能修改总账户(避免总金额计算错误),哪怕这些柜员来自不同分支(不同对象实例)。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务