JAVA 继承Thread 实现多线程 资源不共享? 请保持清醒 。

简介: JAVA 继承Thread 实现多线程 资源不共享? 请保持清醒 。

前排我先说结论:



继承Thread 实现多线程  ,

‘ 不 易 ’ 实现 资源共享 (甚至不易我都加了符号的),


而不是   不能实现资源共享 !!!


看看现在网上的有些文章 (包括一些所谓的面试宝典,文字简短但是害人不浅),随便截一些图:


 image.png


然后类似的例子 演示大致如下 ,写了个卖瓜例子:


image.png咋一看好像确实是资源不共享 。


真的吗,显然是代码写的问题。


1、 private int watermelon=10;  瓜 数 是类的 一个 私有变量 。


2、  new了 两个 卖瓜的摊子, 每个摊子 都有 自己的10个瓜 。


new TestThread().start();

new TestThread().start();


每个线程自己卖自己的瓜, 本来就是 每个摊子 10个瓜 ,这是超卖? 这是资源不共享问题?


这么写,明摆着不就是不同资源不同执行么,何来所谓的资源共享问题?


现在看看,我把调用的实现代码写成这样:


        TestThread testThread=new TestThread();
        new Thread(testThread).start();
        new Thread(testThread).start();

image.png 


运行结果,是不是就共享了 :


image.png


这样存在的问题就是 ,需要考虑线程并发带来的 数据同步问题 :


多运行几次,可以看到出现了一些 坏现象


image.pngimage.png


这时候,简单的解决这个同步的问题,那就是使用 synchronized    :


把涉及到数量的变化的代码块,我们使用   synchronized  给它锁起来 :


image.png


这样一来,尽管多个线程同时进行,操作同个资源 ,也不会出现 坏现象 ,谁能抢到资源,谁执行,但是执行时,别的都需要耐心等 :


image.png


所以说, 记住了 !!!


继承Thread类 实现多线程   和 实现 Runnable接口   实现多线程    


这两个的区别里面 , 不要再说  继承Thread类  不能 实现 多线程资源共享了!


是  ‘ 不 易 ’ 实现 资源共享 (不易也是勉强的言词),而不是   不能实现资源共享 !

也可以点进去看看 Thread 的源码 ,其实就是实现了Runable ,我们在了解 继承Thread类 和 实现 Runnable接口   这两种方式实现多线程, 我们一定要保持清醒:


image.png


就到这吧。

相关文章
|
6月前
|
Arthas 监控 Java
Arthas thread(查看当前JVM的线程堆栈信息)
Arthas thread(查看当前JVM的线程堆栈信息)
1057 10
|
6月前
|
缓存 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析
活锁:多个线程相互影响对方退出同步代码块的条件而导致线程一直运行的情况。例如,线程1的退出条件是count=5,而线程2和线程3在其代码块中不断地是count进行自增自减的操作,导致线程1永远运行。内存一致性问题:由于JIT即时编译器对缓存的优化和指令重排等造成的内存可见性和有序性问题,可以通过synchronized,volatile,并发集合类等机制来解决。这里的线程安全是指,多个线程调用它们同一个实例的方法时,是线程安全的,但仅仅能保证当前调用的方法是线程安全的,不同方法之间是线程不安全的。
124 0
|
6月前
|
Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(3-2):并发共享问题的解决与分析
wait方法和notify方法都是Object类的方法:让当前获取锁的线程进入waiting状态,并进入waitlist队列:让当前获取锁的线程进入waiting状态,并进入waitlist队列,等待n秒后自动唤醒:在waitlist队列中挑一个线程唤醒:唤醒所有在waitlist队列中的线程它们都是之间协作的手段,只有拥有对象锁的线程才能调用这些方法,否则会出现IllegalMonitorStateException异常park方法和unpark方法是LockSupport类中的方法。
128 0
|
10月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
519 15
|
11月前
|
Java 程序员 调度
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
创建线程的五种方式,Thread常见方法(守护进程.setDaemon() ,isAlive),start和run方法的区别,如何提前终止一个线程,标志位,isinterrupted,变量捕获
|
11月前
|
安全 Java API
【JavaEE】多线程编程引入——认识Thread类
Thread类,Thread中的run方法,在编程中怎么调度多线程
|
12月前
|
Java C# Python
线程等待(Thread Sleep)
线程等待是多线程编程中的一种同步机制,通过暂停当前线程的执行,让出CPU时间给其他线程。常用于需要程序暂停或等待其他线程完成操作的场景。不同语言中实现方式各异,如Java的`Thread.sleep(1000)`、C#的`Thread.Sleep(1000)`和Python的`time.sleep(1)`。使用时需注意避免死锁,并考虑其对程序响应性的影响。
303 8
|
12月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
981 60