java多线程可不可以通过私有静态变量创建多个对象开启线程实现资源共享?

比如:
public class Main
{
public static void main(String[] args)
{
new MyThread().start();
new MyThread().start();
}
}
public class MyThread extends Thread
{
private static int tickets=100;
public void run(){
while(true){
tickets--;
if(tickets>0){
Thread th=Thread.currentThread();//获取当前线程
String na=th.getName();//获取当前线程名字
System.out.println(na+"正在发售第"+tickets+"张票");
}
}
}
}

3个回答

会导致**资源竞争**的出现,可以使用AtomicInteger来代替

qq_38300805
qq_38300805 非常感谢
2 年多之前 回复

这样的代码流程想实现资源共享是不行的,你的确是new了两个新的线程出来,也开启了两个线程,但是你想一下,是不是两个线程的run方法在自己跑自己的,虽然我并没有运行你这段代码,但是个人觉得会出现这两种情况:
1、两个线程跑出了200的资源;
2、这也是你的静态变量可能起到了作用,出现的类似同步的情况,那就是两个线程有时候会卖出同一张票
说了你的情况之后,那说一下你的这个功能应该怎么实现,用同步(synchronized),同步对象,这样才能真正的实现多窗口同时买票!
我把你的代码改一下,你看一下

     public class Main{
        public static void main(String[] args){
            new MyThread().start();
            new MyThread().start();
        }
    }
    public class MyThread extends Thread{
        private static int tickets=100;
        public void run(){
            only();
        }
        public synchronized void only(){
        //同步这个方法,每次只能一个线程访问此方法,
            while(true){
                    tickets--;
                    if(tickets>0){
                        String name=Thread.currentThread().getName();//获取当前线程名
                        System.out.println(name+"正在发售第"+tickets+"张票");
                }
            }
        }
    }
qq_38300805
qq_38300805 非常感谢
2 年多之前 回复

内部类用静态变量有意义吗?

qq_38300805
qq_38300805 非常感谢
2 年多之前 回复
skyman1942
北极熊vv 静态是可以保证共享的,但是多线程就必须保证线程安全。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
【java】实现多线程资源共享
java中多线程有两种实现方式,一种是继承Thread类,另一种是实现Runnable接口。而要想实现资源共享就只能用第二种方法来做。class MyThread implements Runnable{ private int ticket = 5; public void run(){ for(int i = 0; i < 10; i++){
多线程线程资源共享问题
简介 在多线程的环境下, 由于公共资源可能会被多个线程共享, 也就是多个线程可能会操作( 增、删、改等 )同一资源. 当多个线程操作同一块资源时, 很容易导致数据错乱或发生数据安全问题, 即: 数据有可能丢失, 有可能增加, 有可能错乱. 资源共享经典问题–>卖票逻辑伪代码: if( 余票 > 0 ) ……余票-1 else ……提示无票 代码 Swiftvar vot
Java多线程 - 线程的创建
在学习多线程前,需要知道为啥要用多线程,多线程的有点是什么? 使用多任务操作系统(windows,ios)等,都可以最大限度的利用CPU空闲时间来出来其他任务,比如一边让操作系统处理打印机正在打印的数据,一边使用Word编辑文档。而CPU在这些任务之间不停的切换,由于切换的速度非常快,给使用者感受这些任务都是在同时运行。所以使用多线程,可以在同一时间处理多个任务,使系统的运行效率大大提升。线程一个
java多线程-线程的创建
1.区分线程与进程: ·进程:是指正在执行的程序(应用一个程序时的一个实例就是一个线程); ·线程:是程序执行的一种路径,是进程中独立运行的子任务; ·关系: 一个进程中可以有多个线程,但一个线程一定是在一个进程的; 2.线程的直观描述:同时并发进行多项任务处理 3.java如何创建线程(两种方式) 1>继承Thread类,并重写run()方法,代码如下:pub
【多线程】Java线程的创建
第2章 Java并行程序基础 2.2 初始线程:线程的基本操作 2.2.1 新建线程 新建线程方式一: Thread thread = new Thread(); thread.start();   new 一个对象thread后,执行这个对象的start()方法则会启动该线程的内部run()方法。run()方法这里没定义,下...
JAVA --- 多线程 -- 线程的创建
JAVA — 多线程 – 线程的创建 线程的概念: 说起线程,先说程序和进程,多任务的概念。 程序(program):是指令和数据的有序集合,本身没有任何运行的含义,是一个静态的概念。 进程(process):是执行程序的一次执行过程,是一个动态的概念。是系统资源分配的单位。 多任务(multitasking):操作系统中的多任务是在同一时刻运行多个程序的能力。 多线程程序:是在较低层次上扩展...
java多线程------实现Runnable接口创建多进程,实现资源共享
//实现Runnable接口创建多进程,实现资源共享 package xian_cheng; public class Example05 { public static void main(String[] args) { // TODO Auto-generated method stub TickWindow tw=new TickWindow();//实例化对象tw ne
VB可不可以创建多线程
VB可不可以创建多线程呢? 进程:是指程序在一个数据集合上运行的过程,是操作系统进行资源分配和调度运行的一个独立单位,简单来说进程就是程序的一次执行。
springboot 开启多个线程
介绍一些接口操作可以毕竟费时,而tomact线程的数量又是有限的,想要提高web吞吐量可以在spring里开启异步。spring默认的线程是有限的(反正默认的不太好之类的),需要自己手工配置个线程池效果会更好。@Configuration @EnableAsync//开启对异步任务的支持 public class ThreadAsyncConfigurer implements AsyncCon...
Java 多线程(一) 线程的创建
现代操作系统中,进程是资源分配的基本单位,而线程是调度的基本单位。一个进程内可以有多个线程,而这些线程可以共享进程的资源,比如内存资源,IO资源。 大家开发常用的Eclipse启动后就是一个进程,而使用它的不同功能会启动对应不同的线程,如代码编辑版块是一个线程在处理,视图(按钮,鼠标点击等)响应是另一个线程在处理。多线程提升了处理器的使用效率,因为在一个线程空闲时,处理器可以调用其他线程,宏观上来
java多线程---线程的创建方式
线程常见的拥有两种创建方式: 使用继承的方式来创建线程有一个弊端就是java类是单继承的,不利于线程类再继承其他的类,所以一般使用实现Runnable接口的方式 代码分别如下: package com.zcj.thread; public class ThreadCreateWay { public static void main(String[] args){ Thread01
Java并发线程--多线程的创建
线程是java语言中不可或缺的重要功能,它们能使复杂的异步代码变得更简单,从而极大地简化了复杂系统的开发,如何高效的使用并发变得越来越重要。得当的使用线程,可以有效地降低程序的开发和维护成本,同时提升复杂应用程序的性能。线程能够将大部分的异步工作流转换成串行工作流,因此能更好地模拟人类的工作方式和交互方式。此外,线程还可以降低代码的复杂度,使代码更容易编写、阅读和维护。创建线程的三种方式◎定义线程类
Java多线程2—线程的创建
在java语言出现之前,多线程是通过操做硬件等方法实现的,尽管这是一种有用的方法,但编出的程序很难移植,所以程序员往往为此付出不小的代价。Java是第一个从语言级实现多线程的方法。由于java实现了多线程,使得利用java编写多线程的程序也比较简单,因此这也成了java语言相比于其他语言的一个优势。另外java是运行在虚拟机上的,可移植性强,这个特点和简单的多线程编写配合,使的java的优势更明显。扯的有点远了,回来,下面介绍线程的创建。rn在创建我们自己写的线程的时候,java就已经先创建了一个线程,就是我们运行主函数main的线程。有时候我们可能会需要得到当前正在运行的线程,这里我们就可以用Thread类中的静态方法currentThread(),这个函数返回的是一个Thread类的实例的引用,我们可以调用getName()方法获得当前的线程的名字(具体的方法请读者自己查看java的帮助文档)。下面我们举一个例子:rnpublic class aaarnrn public static void main(String[] args)rn rn System.out.println(Thread.currentThread().getName());rn rnrn//mainrn下面我们介绍java中怎么创建多线程,java提供了两种创建多线程的方法,如下:rn (1)从Thread类继承;rn(2)实现Runnable接口。rn对于这两种创建线程的方法,都必须实现一个run()方法,因为在我们创建线程后,调用start()启动线程之后,调用的是run()方法。rn这里多说一句,在java中有许多的类跟接口可以实现同样的功能,有些人就感觉这个多此一举。但是认真想想,java为了安全的考虑只支持单继承,但是我们的实际开发中,课程需要同时继承两个类,但是java又是不允许。这里接口就发挥作用了,我们可以继承一个类,同时实现一个或多个接口(对于接口实现的个数java中没有限制)。rn下面介绍第一个创建线程的方法,我们还是以例子的形式给出:rnpublic class aaarnrn public static void main(String[] args)rn rn System.out.println(Thread.currentThread().getName());rn MyThread mt = new MyThread();//创建MyThread类的一个实例,并把它赋给mtrn mt.start();//启动线程rn rnrnclass MyThread extends Threadrnrn public void run()rn rn System.out.println(Thread.currentThread().getName());rn rnrn上面的例子显示了创建线程的第一方法,多说一句,有时候我们需要在启动线程的时候,去做一些别的工作,这些工作不是我们在创建对象的时候做的,我们可以重写Thread类的start()方法,就像下面一样rnpublic void start()rn 自己想要做的工作rn Super.start();rnrn下面我们介绍第二种创建线程的方法,还是以例子的形式给出:rnpublic class aaarnrn public static void main(String[] args)rn rn System.out.println(Thread.currentThread().getName());rn MyThread mt = new MyThread();//创建MyThread类的一个实例,并把它赋给mtrn Thread t = new Thread(mt);//创建一个Thread类的对象,并且将我们实现了run()方法的MyThread类的对象的实例mt作为参数传入rn t.start();//启动线程rn rnrnclass MyThread implements Runnablernrn public void run()rn System.out.println(Thread.currentThread().getName());rn//mainrnThread-0rn在我实现runnable接口创建线程的时候,我们必须将我们自己写的类的实例作为参数传给一个Thread类的对象,然后在调用该对象的start()方法。rn这里简单的介绍了一下,希望对大家有帮助,如果有错或者不妥当的地方希望指出。rn
创建、开启线程方式
(创建线程,使用Handler启动线程)方式
C++11多线程 创建多个线程、数据共享问题
目录 1.创建和等待多个线程 2.数据共享问题分析 2.1 只读数据 2.2 有读有写: 3.共享数据的保护案例代码 1.创建和等待多个线程 a)多个线程执行顺序是乱的,跟操作系统内部对线程的运行调度机制有关; b)主线程等待所有子线程运行结束,最后主线程结束,推荐使用这种join的写法,更容易写出稳定的程序; c)咱们把thread对象放入到容器里管理,看起开像个thread对...
Java多线程--多个对象多个锁
上一篇博客中介绍了多个线程同时访问一个对象,产生一个对象锁,属于同步访问,现在介绍下如果是访问多个对象,会怎么执行那? Demo: HasSelfPrivateNum类: public class HasSelfPrivateNum { private int num=0; synchronized public void addI(String username){ ...
类的私有成员函数可不可以做线程函数?
如题。
多线程资源共享
一、线程的创建和启动 定义线程类实现Runnable接口: Thread myThread = new Thread(target) //target为Runnable接口类型 而 Runnable中只有一个方法: public void run();用以定义线程运行体 Thread 类是一个具体的类,该类封装了线程的行为。要创建一个线程,程序员必须创建一个从 Thread 类导
java多个线程是共享同一个对象的方法??(多线程的局部变量)
当两个不同的线程去访问同一个对象的相同方法时!1、内存中只存在一个方法。两个线程进入同一个内存区?还是内存中存在两个相同的方法。两个方法进入不同的内存区?rn 2、 方法内的变量又是怎样存储的??
多线程学习--通过单例模式来实现多个线程中的数据共享
package Demo6; import java.util.Random; public class ThreadlocalTest { //private static ThreadLocal tl =new ThreadLocal(); private static ThreadLocal msd=new ThreadLocal(); public static void mai
java se 多线程资源共享问题
n class breadn int num = 0;n n public synchronized void makeBreand()n num++;n this.notify(); n n n n public synchronized void sale()n while(num==0)n tryn this.wait();n System.out.println("暂时无面包,等待");n catch(InterruptedException e)e.printStackTrace();n n n num--;n n n nclass makeThread implements Runnablen bread account;n n public makeThread(bread s)n account = s;n n n public void run()n while(account.num<10)n account.makeBreand();n System.out.println(Thread.currentThread().getName()+"thread is working");n System.out.println("面包数量+1,已有"+account.num+"个面包");n tryn Thread.sleep(1000);n catch(InterruptedException e)e.printStackTrace();n n n nnnclass saleThread implements Runnablen bread left;n public saleThread(bread s)n left = s;n n public void run()n if(left.num>0)n left.sale();n System.out.println(Thread.currentThread().getName()+"售出面包一个");n System.out.println("目前有"+left.num+"个面包");n tryn Thread.sleep(1000);n catch(InterruptedException e)e.printStackTrace();n n nnnpublic class testn public static void main(String[] args)n bread b = new bread();n n saleThread sale = new saleThread(b);n makeThread make = new makeThread(b);n Thread t1 = new Thread(make);n Thread t2 = new Thread(sale);n t1.start();n t2.start();n nnnnn代码如下,运行效果:nThread-1售出面包一个nThread-0thread is workingn目前有0个面包n面包数量+1,已有0个面包nThread-0thread is workingn面包数量+1,已有1个面包nThread-0thread is workingn面包数量+1,已有2个面包nThread-0thread is workingn面包数量+1,已有3个面包nThread-0thread is workingn面包数量+1,已有4个面包nThread-0thread is workingn面包数量+1,已有5个面包nThread-0thread is workingn面包数量+1,已有6个面包nThread-0thread is workingn面包数量+1,已有7个面包nThread-0thread is workingn面包数量+1,已有8个面包nThread-0thread is workingn面包数量+1,已有9个面包nThread-0thread is workingn面包数量+1,已有10个面包nnnn为什么我的sale进程只被调用了一次?
多线程实现资源共享 ——购票操作
package Ticket; /**  * Created by me on 2017/5/7.  */ public class ShareDataThreadDemo {     public static void main(String[] args) {        /* TicketTThread ticketTThread1=new TicketTThread
python manager 实现线程资源共享
from multiprocessing import Process,Manager def  f(d,l):     d[0] = 0     d['2'] = 'hello world'     d['3'] = None     l.reverse() if __name__ == '__main__':     manger = Manager()     #声明一个
【多线程】线程工厂模式创建多线程
通过实现ThreadFactory 来创建线程工厂public class TestingThreadFactory implements ThreadFactory{ //Executors 线程池的顶级接口,创建默认线程工厂 ThreadFactory factory=Executors.defaultThreadFactory(); @Override ...
Java 线程基础和实现多线程
线程基础 1)进程的概念 正在执行的程序称作为进程。进程负责了内存的划分 2)线程 一个程序可能包含多个并发运行的任务,一个任务从头至尾的执行流。可以在一个程序中并发地启动多个线程。 3)多线程 在一个进程中有多个线程同时在执行不同的任务。运行一个Java程序,jvm在运行的时候会创建一个main线程执行main方法中的所有代码。 一个Java应用程序至少有几个线程? 一个是主线程...
java 多线程 (一)线程的实现
一、作用   多线程,可以真正发挥出多核CPU的优势来,提高cpu的利用率,达到充分利用CPU的目的。 二、实现方式   多线程主要有两种实现方式、分别是继承Thread类和实现Runnable接口作为宿主。   1、继承Thread接口、重写run方法 public class Thread2 { public static void main (String[] args) {
java线程学习之线程的开启
线程开启(and命名): // 线程1 Thread myThread = new Thread(&quot;threadNo1&quot;){ public void run(){ System.out.println(&quot;线程No1&quot;); } }; //线程2 MyThread mt = new MyThread(); ...
JAVA多线程一(线程的实现)
多线程的实现 一.简介 java 可在单个程序中同时运行多个线程,并内置了对并发编程的支持。线程也称为轻量级进程,拥有自己的堆栈,寄存器和程序计数器,各个线程内运行的代码仅在该线程上下文中起作用。合理应用多线程,可以通过优化系统资源的使用来提高程序的性能和响应的速度。 二.多线程的实现 实现多线程的方式有两种,一种是创建Thread的子类并覆盖该run()方法。第二种方法是Runnab...
多线程——线程的创建
创建线程的的方法 class mythread extends Thread { public void run( ) { /* 覆盖该方法*/ } } class mythread implements Runnable{ public void run( ) { /* 实现该方法*/ } } ...
多线程-线程的创建
多线程已知的两种创建方式
关于多线程问题(新开启的线程里面再开启线程)
先说下流程:首先运行主方法MainFun()这个方法会开启5个线程,每个线程调用DoSomething这方法,在DoSomething这个方法里面又会再开启线程(可能会开启多个),然后分别调用A、B、C、D、E5个方法。rn现在的问题是,我测试的时候,我用一个按钮的单击事件调用MainFun(),发现有时候程序会崩溃(什么错都不报直接关闭了),有时候正常运行,如果我按钮点快了是100%程序会崩溃的。求解决,多线程不会,改怎么解决,还是我写的有问题?主要代码如下:rn[code=csharp]rn private void MainFun()rn rn string[] chanArr = new string[] "A", "B", "C", "D", "E" ;rn for (int i = 0; i < chanArr.Length; i++)rn rn Thread th = new Thread(new ParameterizedThreadStart(DoSomething));rn th.Start(chanArr[i]);rn rn rn private void DoSomething(object nodeName)rn rn List> list = new List>();rn list = ReadFromXml(nodeName.ToString());rn if (list.Count <= 0)rn return;rn for (int i = 0; i < list.Count; i++)rn rn string chanId = list[i]["ChanId"]; rn string param = list[i]["param"]; rn ParameterizedThreadStart pts = null;rn if (chanId == "9")rn pts = new ParameterizedThreadStart(A);rn if (chanId == "521")rn pts = new ParameterizedThreadStart(B);rn if (chanId == "525")rn pts = new ParameterizedThreadStart(C);rn if (chanId == "526")rn pts = new ParameterizedThreadStart(D);rn if (chanId == "532")rn pts = new ParameterizedThreadStart(E);rn Thread th = new Thread(pts);rn th.Start(param); rn rn rnprivate void A(object param)rn rn rn private void B(object param)rn rn rn private void C(object param)rn rn rnrn private void D(object param)rn rn rn private void E(object param)rn rn rn[/code]rn
线程一:创建多线程
一、概念        &quot;线程&quot;是计算机执行任务的基本单位,通常&quot;线程&quot;作为&quot;进程&quot;的一部分,也就是说&quot;线程&quot;的集合是&quot;进程&quot;。而计算机进行任务调度的时候通常以&quot;进程&quot;为单位,所以说&quot;进程&quot;是重量级的,而&quot;线程&quot;则是相对的轻量级任务执行单位。 二、方法 1、实现Runnable接口         类TestRunnable实现了接口Ru
java多线程(2):线程的实现
前言 线程的实现主要有三种方式:继承Thread类,实现Runnable接口,实现Callable接口和Future获取返回值。 继承Thread类 继承Thread类须重写run()方法。如果没有重写run()方法,那这个线程类没有任何执行方法。 public class MyThread extends Thread{ @Override public void ...
Java多线程——进程与线程、多线程的实现
一、进程与线程 1、进程 正在运行的程序,是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源 2、线程 是进程中的单个顺序控制流,是一条执行路径 一个进程如果只有一条执行路径,则称为单线程程序 一个进程如果有多条执行路径,则称为多线程程序 二、Java程序运行原理 java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进...
线程与多线程(二)——java实现多线程
二、 在Java中实现多线程        每个程序至少自动拥有一个线程,称为主线程。当程序加载到内存时,启动主线程。Java 程序中的public static void main( )方法是主线程的人口,运行Java程序时,会先执行这个方法。         开发中, 用户编写的线程般都是指除了主线程之外的其他线程。         使用一个线程的过程,可以分为4个步骤:         (...
Java的多线程-实现多线程及线程的同步
欢迎访问: http://www.ptcms.cnJava的多线程-实现多线程及线程的同步 一. 实现多线程    1. 虚假的多线程  例1:    public class TestThread { int i=0, j=0; public void go(int flag){ while(true){ try{ Thread.sleep(100); } catch(InterruptedEx...
java开启多线程的两种方式以及通过匿名类实现方式
多线程:同时做多个事情 java多线程主要用到Runnable接口,而这个接口主要用到run这个方法。 public class myThreads implements Runnable{ @Override public void run() { // TODO Auto-generated method stub //显示十次两个线程的运行先后情况 for(int i=0;...
多线程--多个线程循环顺序的多种实现。
问题:3个线程按顺序打印ABC,A线程打印A,B线程打印B,C线程打印C.实现一:使用synchronized关键字:package com.Thread; import java.util.concurrent.atomic.AtomicInteger; /** * Created by Administrator on 2018/3/25 0025. */ public class P...
怎么实现线程内的静态变量?
现在我有一个线程处理函数:rnDWORD WINAPI ThreadProc(LPVOID lpParameter)rnrn static int i=0;rn while(TRUE)rn rn i++;rn rnrnrn现在创建两个线程,第一个线程运行时可能对 i的值作了修改,第二个线程运行实现要求i必须时原始值,即是0,(两个线程不是同时创建的),请问怎么实现?rnrn是不是有线程内的静态变量?rnrn
java线程的静态变量共享问题
下面的输出结果可能是45; 90; 或 90;90 两种可能. 理论上static 静态变量不是被共享的吗? 会打印出90这个值说明static tick 变量确实是被共享的; rn那么, 下面是我的分析:rn出现90;90这个打印结果,是不是因为第一个线程执行完++到45,但还没来得执行System.out.println(Thread.currentThread().getName()+" : " + tick);. 第二个线程完成了++到了90, 这时候第一个线程再执行System.out.println(Thread.currentThread().getName()+" : " + tick); 就打印出90了. 然后第二个线程也当然是打印90!rnrn最后,问题来了!!!! [cpu执行一个线程的run方法, 是不是不能保证一次性全部执行到结束!???]rnrnrn[code=java]package java11;rnrnclass Ticket implements Runnable //extends Threadrnrn private static int tick = 0;rnrn @Overridern public void run() rnrn for (int i=0; i<10; i++)rn tick = tick+ i;rn rn System.out.println(Thread.currentThread().getName()+" : " + tick);rn rnrnrnrnclass TicketDemornrn public static void main(String[] args) rn rn Ticket t1 = new Ticket(); rn Ticket t2 = new Ticket(); rn Ticket t3 = new Ticket(); rn Ticket t4 = new Ticket(); rn new Thread(t1).start(); rn new Thread(t2).start();rn rn rn[/code]
相关热词 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天 c#字典序排序 c# 截屏取色 c#中的哪些属于托管机制