关于通过extends实现的多线程疑问

问题描述

我想问问通过extends方法创建的多线程对象1它们操作的是不是同一个单例方法?是的话那如果在一开始判断的时候线程切换了,会不会出现2个线程都判断null而产生2个对象?我试了挺多次都是同一个对象..难道线程有运行先后之分吗?publicclassDemo6{publicstaticvoidmain(String[]args){ThreadTestt1=newThreadTest();ThreadTestt2=newThreadTest();t1.start();t2.start();}}classThreadTestextendsThread{@Overridepublicvoidrun(){for(inti=0;i<50;i++){InstanceDemo.getInstance();//重写线程父类run方法}}}classInstanceDemo{//首先你得写一个单例模式privateInstanceDemo(){}//私有化构造函数privatestaticInstanceDemoinstance;//这里用的是懒汉式所以只是声明//然后提供一个对外提供唯一实例的方法publicstaticInstanceDemogetInstance(){if(instance==null){instance=newInstanceDemo();}System.out.println(Thread.currentThread().getName()+instance);returninstance;}}

解决方案

解决方案二:
1、线程同步,将getInstance方法加上synchrolize关键字2、线程运行没有先后之分,你的这种情况只是偶然吧
解决方案三:
我可能想明白了。通过extends操作的不是同一份资源,但是如果是单例模式的话某种意义上说就相当于是操作同一份资源了,所以它们还是会有可能出现问题的,在sleep方法之后就有可能出现问题的否则几率极低。不知道我的理解有没问题望指点!
解决方案四:
你的代码写的是有问题的,并不能保证绝对单例。可以将实例化放到static块中,或者将getInstance进行同步控制。
解决方案五:
1、是肯定的,必定是操作同一个getInstance()方法。2、理论上有可能两个线程都判断到instance==null的情况。3、线程运行当然有先后之分了,只不过这个先后顺序由CPU统一去调度,我们一般无法控制,且某线程正在运行时,CPU可能会先暂停该线程而去运行其它的线程。
解决方案六:
如果你用10个甚至更多的线程去跑的话,并且在getInstance方法内sleep一段时间,就会发生创建多个实例的情况了亲自跑过publicclassDemo6{publicstaticvoidmain(String[]args){//ThreadTestt1=newThreadTest();//ThreadTestt2=newThreadTest();////t1.start();//t2.start();for(inti=0;i<10;i++){ThreadTestt1=newThreadTest();t1.start();}}}classThreadTestextendsThread{@Overridepublicvoidrun(){for(inti=0;i<50;i++){InstanceDemo.getInstance();//重写线程父类run方法}}}classInstanceDemo{//首先你得写一个单例模式privateInstanceDemo(){}//私有化构造函数privatestaticInstanceDemoinstance;//这里用的是懒汉式所以只是声明//然后提供一个对外提供唯一实例的方法publicstaticInstanceDemogetInstance(){if(instance==null){try{Thread.sleep(1000);//为了更容易发生}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}instance=newInstanceDemo();}System.out.println(Thread.currentThread().getName()+instance);returninstance;}}

结果至少创建了三个实例Thread-3com.zp.threadtest.InstanceDemo@8813f2Thread-7com.zp.threadtest.InstanceDemo@83cc67Thread-1com.zp.threadtest.InstanceDemo@8813f2Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@83cc67Thread-8com.zp.threadtest.InstanceDemo@e09713Thread-8com.zp.threadtest.InstanceDemo@e09713Thread-8com.zp.threadtest.InstanceDemo@e09713Thread-8com.zp.threadtest.InstanceDemo@e09713
解决方案七:
publicstaticInstanceDemogetInstance(){if(instance==null){synchronized(instance){if(instance==null){instance=newInstanceDemo();}}}System.out.println(Thread.currentThread().getName()+instance);returninstance;}

这样写就不会出现实例化两个以上对象的情况了其他的问题楼上也已有回答,但是关于线程的先后之分这个问题,我觉得楼上的回答都不正确,这个可以分为时间上的先后和执行顺序上的先后去讨论,而后者是可以通过同步去控制的。鄙人也是菜鸟一枚,在这里就不多说了

时间: 2024-09-19 08:18:59

关于通过extends实现的多线程疑问的相关文章

多线程-疑问:线程启动之后再设置线程的优先级别,逻辑上是不是有问题?

问题描述 疑问:线程启动之后再设置线程的优先级别,逻辑上是不是有问题? 正在学习多线程,有这样一个疑问:线程启动之后再设置线程的优先级别,逻辑上是不是有问题?求助大神们解答下. 解决方案 没啥问题,相当于动态调整线程优先级.因为线程优先级是影响CPU调度优先级,你修改了,就可以影响下一次CPU的选择.所以可以启动再修改. 解决方案二: 没有问题,但是要注意,如果你启动的时候创建的是实时优先级,那么可能更改优先级的代码得不到及时执行. 解决方案三: 现代操作系统都是多任务抢占式操作系统,系统会随时

mina2多线程疑问

问题描述 <div class="iteye-blog-content-contain" style="font-size: 14px">在mina2中,如果在代码中使用了dfcb.addLast("executor", new ExecutorFilter(Executors.newCachedThreadPool()));拦截器,并且开了很多的客户端测试,发现后台的pool-3-thread线程会很多,有时候这个线程过多会出现内存

java工作笔记之多线线程实例详解

一.多线程 1.什么是多线程 简单的可以理解为多个线程同时执行多个任务,比如同时下载10个URL 的速度会比一个个下载快的多. 有兴趣深入研究原理可以学习下什么叫线程,进程 2.java多线程Thread方法小例子 extends Thread 的方式进行一次多线程实验 3.runable例子 二.java采用Runnable 实现多线线程 使用实现Runnalbe可以做出一个多线程,之前我们采用继承Thread的办法也做出一个.  代码如下 复制代码 public class TestMiti

多线程-php单例问题 疑问求解答

问题描述 php单例问题 疑问求解答 A.php <?php class Singleton { private static $instance; private function __construct() { echo "This is ok!rn"; } public static function GetInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self();

c-关于多线程的疑问,求各位大神解答

问题描述 关于多线程的疑问,求各位大神解答 ```using namespace std; DWORD WINAPI Thread_accept (PVOID lParam) { cout<<"进入线程"<<endl; return 0; } int main() { WSADATA wsaData; WSAStartup (MAKEWORD (2, 2) ,&wsaData); HANDLE Thread; Thread = CreateThread

java多线程,显示结果有疑问

问题描述 java多线程,显示结果有疑问 package com.ii11; public class ThreadDemo2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub TestThread t = new TestThread(); new Thread(t).start(); for(int i=0; i<3; i++) { System

Android多线程编程AsyncTask详解教程

Android中多线程编程中AsyncTask类的详细解释1.Android单线程模型2.耗时操作放在非主线程中执行 Android主线程和子线程之间的通信封装类:AsyncTask类1.子线程中更新UI2.封装.简化异步操作.3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的.必须等前边的线程执行完毕后,后边的线程才能执行. AsyncTask类使用注意事项: 1.在UI线程中创建AsyncTask的实例2.必须在UI线程中调用AsyncTas

Android开发笔记之:深入理解多线程AsyncTask_Android

Understanding AsyncTaskAsyncTask是Android 1.5 Cubake加入的用于实现异步操作的一个类,在此之前只能用Java SE库中的Thread来实现多线程异步,AsyncTask是Android平台自己的异步工具,融入了Android平台的特性,让异步操作更加的安全,方便和实用.实质上它也是对Java SE库中Thread的一个封装,加上了平台相关的特性,所以对于所有的多线程异步都强烈推荐使用AsyncTask,因为它考虑,也融入了Android平台的特性,

Java Thread多线程全面解析_java

多线程是java中很重要的知识点,在此小编给大家总结Java Thread多线程,非常有用,希望大家可以掌握哦. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了.主要包括: Java线程具有五种基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnab