精华内容
下载资源
问答
  • java线程共享变量与静态变量

    千次阅读 2013-04-05 11:22:22
    以下三种情况说明java中全局变量与静态变量线程间的关系 情况一: /** * 两个线程对【两】个对象操作,这两个对象的类中的【静态变量线程间共享】 * * @author thinktown * */ public class Test1 ...

    
    

    以下三种情况说明java中全局变量与静态变量在线程间的关系

    情况一:

    /**
     * 两个线程对【两】个对象操作,这两个对象的类中的【静态变量在线程间共享】
     * 
     * @author thinktown
     * 
     */
    public class Test1 {
    
    	public static void main(String[] args) {
    
    		Ru1 ru1 = new Ru1();
    		Ru1 ru2 = new Ru1();
    		new Thread(ru1).start();
    		new Thread(ru2).start();
    	}
    
    }
    
    class Ru1 implements Runnable {
    
    	private static int num = 0;
    
    	@Override
    	public void run() {
    
    		for (int i = 0; i < 10; i++) {
    			num = num + i;
    		}
    		System.out.println("静态变量的值:" + num);
    
    	}
    }
    
    输出:

    静态变量的值:45
    静态变量的值:90

    情况二:

    /**
     * 两个线程对【两】个对象操作,这两个对象的类中的【全局变量在线程间互不影响】
     * 
     * @author thinktown
     * 
     */
    public class Test2 {
    
    	public static void main(String[] args) {
    
    		Ru2 ru1 = new Ru2();
    		Ru2 ru2 = new Ru2();
    		new Thread(ru1).start();
    		new Thread(ru2).start();
    	}
    
    }
    
    class Ru2 implements Runnable {
    
    	private int num = 0;
    
    	@Override
    	public void run() {
    
    		for (int i = 0; i < 10; i++) {
    			num = num + i;
    		}
    		System.out.println("全局变量变量的值:" + num);
    
    	}
    }
    
    输出:

    全局变量变量的值:45
    全局变量变量的值:45


    情况三:

    /**
     * 两个线程对【一】个对象操作,这两个对象的类中的【全局变量在线程间共享】
     * 
     * @author thinktown
     * 
     */
    public class Test3 {
    
    	public static void main(String[] args) {
    
    		Ru3 ru1 = new Ru3();
    		new Thread(ru1).start();
    		new Thread(ru1).start();
    	}
    
    }
    
    class Ru3 implements Runnable {
    
    	private int num = 0;
    
    	@Override
    	public void run() {
    
    		for (int i = 0; i < 10; i++) {
    			num = num + i;
    		}
    		System.out.println("全局变量变量的值:" + num);
    
    	}
    }
    
    输出:

    全局变量变量的值:45
    全局变量变量的值:90



    展开全文
  • 1. 静态变量线程不安全 静态变量位于方法区,为所有对象共享,它们共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程不安全。 public class Test1 implements Runnable { private static int ...

    1. 静态变量:线程不安全

    静态变量位于方法区,为所有对象共享,它们共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程不安全。

    public class Test1 implements Runnable {
    	private static int static_i;// 静态变量
    
    	public void run() {
    		static_i = 4;
    		System.out.println("[" + Thread.currentThread().getName() + "]获取static_i 的值:" + static_i);
    		static_i = 10;
    		System.out.println("[" + Thread.currentThread().getName() + "]获取static_i*2的值:" + static_i * 2);
    	}
    
    	public static void main(String[] args) {
    		Test1 t = new Test1();
    		// 启动尽量多的线程才能很容易的模拟问题
    		for (int i = 0; i < 3000; i++) {
    			// t可以换成new Test(),保证每个线程都在不同的对象中执行,结果一样
    			new Thread(t, "线程" + i).start();
    		}
    	}
    }
    /*
    根据代码注释中模拟的情况,当线程1执行了static_i = 4;  static_i = 10; 后,线程2获得执行权,static_i = 4; 然后当线程1获得执行权执行static_i * 2;必然输出结果4*2=8,按照这个模拟,我们可能会在控制台看到输出为8的结果。
    [线程27]获取static_i 的值:4 
    [线程22]获取static_i*2的值:20 
    [线程28]获取static_i 的值:4 
    [线程23]获取static_i*2的值:8 // 看到这个值,确实如我们的预想
    [线程29]获取static_i 的值:4 
    [线程30]获取static_i 的值:4 
    [线程31]获取static_i 的值:4 
    [线程24]获取static_i*2的值:20
    */

    2. 实例变量:单例模式或只对一个对象进行操作时线程不安全

    实例变量为对象实例私有,在虚拟机堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,犹如静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程不安全;

    如果每个线程都是在不同的对象中,那么对象与对象之间的实例变量的修改将互不影响,故线程安全。

    public class Test2 implements Runnable {
    	private int instance_i;// 实例变量
    
    	public void run() {
    		instance_i = 4;
    		System.out.println("[" + Thread.currentThread().getName() + "]获取instance_i 的值:" + instance_i);
    		instance_i = 10;
    		System.out.println("[" + Thread.currentThread().getName() + "]获取instance_i*2的值:" + instance_i * 2);
    	}
    
    	public static void main(String[] args) {
    		Test2 t = new Test2();
    		// 启动尽量多的线程才能很容易的模拟问题
    		for (int i = 0; i < 3000; i++) {
    			// 每个线程对在对象t中运行,模拟单例情况
    			new Thread(t, "线程" + i).start();
    		}
    	}
    }
    /*
    犹如静态变量那样,每个线程都在修改同一个对象的实例变量,肯定会出现线程安全问题。
    [线程66]获取instance_i 的值:10 
    [线程33]获取instance_i*2的值:20 
    [线程67]获取instance_i 的值:4 
    [线程34]获取instance_i*2的值:8    // 看到这个值,可知单例情况下,实例变量线程非安全。
    [线程35]获取instance_i*2的值:20 
    [线程68]获取instance_i 的值:4
    */

    如果将new Thread(t, "线程" + i).start(); 改成new Thread(new Test(), "线程" + i).start();模拟非单例情况,我们会发现不存在线程安全问题。


    3. 局部变量:线程安全

    每个线程执行时将会把局部变量放在各自栈的工作内存中,线程间不共享,故不存在线程安全问题。

    public class Test3 implements Runnable {
    	public void run() {
    		int local_i = 4;
    		System.out.println("[" + Thread.currentThread().getName() + "]获取local_i 的值:" + local_i);
    		local_i = 10;
    		System.out.println("[" + Thread.currentThread().getName() + "]获取local_i*2的值:" + local_i * 2);
    	}
    
    	public static void main(String[] args) {
    		Test3 t = new Test3();
    		// 启动尽量多的线程才能很容易的模拟问题
    		for (int i = 0; i < 3000; i++) {
    			// 每个线程对在对象t中运行,模拟单例情况
    			new Thread(t, "线程" + i).start();
    		}
    	}
    }

    并未发现异常数据

    http://www.havebug.com/Bughui/201505/38957.html

    展开全文
  • java静态变量与非静态变量的区别

    千次阅读 2018-09-17 18:33:36
    静态变量与非静态变量的区别如下: 1.内存分配 静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡; 而非静态变量需要被实例化后才会分配内存。 2.生存周期 静态变量生存...

    静态变量与非静态变量的区别如下:
    1.内存分配
    静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡;
    而非静态变量需要被实例化后才会分配内存。
    2.生存周期
    静态变量生存周期为应用程序的存在周期;
    非静态变量的存在周期取决于实例化的类的存在周期。
    3.调用方式
    静态变量只能通过“类.静态变量名”调用,类的实例不能调用;
    非静态变量当该变量所在的类被实例化后,可通过实例化的类名直接访问。
    4.共享方式
    静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值;
    非静态变量是局部变量,不共享的。
    5.访问方式
    静态成员不能访问非静态成员;
    非静态成员可以访问静态成员。
    注意:
    1.线程安全:静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发的问题。非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。
    2.如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。

    展开全文
  • Java线程编程中,存在很多线程安全问题,至于什么是...此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量

    Java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:
    写道
    给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。
    此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!

    静态变量:线程非安全。
    静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。

    实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。
    实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。

    局部变量:线程安全。
    每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

    展开全文
  • 参考文章
  • java线程安全问题之静态变量、实例变量、局部变量

    万次阅读 多人点赞 2012-12-14 15:08:06
    java线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一... 此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则
  • Java线程局部变量ThreadLocal

    千次阅读 2018-04-22 16:14:58
    ThreadLocal类可以让每个线程绑定自己的值,它就像一个全局存放数据的盒子,盒子中可以存放每个线程的私有数据。 ThreadLocal类只有一个无参的构造函数,因此实例化ThreadLocal的方法为: new ThreadLocal&lt;T&...
  • 1. java静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public void xxx(){ //code } ...
  • Java线程安全问题之静态成员变量、实例成员变量、局部变量 (原文地址:http://blog.csdn.net/will_awoke/article/details/38044415) java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢...
  • Java 静态类、静态方法和静态变量

    万次阅读 多人点赞 2017-11-06 15:44:52
    转载自Java 静态类、静态方法和静态变量Java 静态类、静态方法和静态变量static 是Java中的一个关键字,我们不能声明普通外层类或者包为静态的。static用于下面四种情况。1.静态变量:我们可以将类级别的变量声明为...
  • Java线程同步方式和线程本地变量——Java经典面试题(其二)实现线程同步的几种方式1.为何要使用同步? Java允许多线程并发控制,当多个线程同时操作一个可共享资源变量时(如数据的增删改查),将会导致数据不...
  • java中用静态变量map实现缓存

    千次阅读 2017-11-02 14:29:28
    package com.terrace.common; import java.util.Iterator; import java.util.Map;  import java.util.Set; import java.util.concurrent.ConcurrentHashMap;  public class MapCacheManager {     
  • java类全局静态变量在多线程中数据混乱问题 解决方法: 可以使用ThreadLocal实现线程内的数据共享,而在另外线程中运行时又共享另外一份数据。 用法:http://www.yayihouse.com/yayishuwu/chapter/1174
  • java静态变量在内存中的位置

    千次阅读 2019-09-10 14:11:16
    java程序在内存中的存储分配情况:一、堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,...
  • 先是定义私有静态变量,然后静态代码块初始化。 ![图片说明](https://img-ask.csdn.net/upload/201811/09/1541745043_546543.png) 标红这行报错,空指针异常。 个人疑问,是否是因为B/S结构...
  • ``` package thread.worker; /** ... * Created by huli3 on 2017/8/16. ... public static void main(String[] args) throws InterruptedException { ... System.out.println(threadGroup.activeCount() + " sum " + ...
  • TheadLocal可以为各个线程...假设有一个静态变量 public static final SimpleDateFormat dateFormat = new SimpleDateFormat(‘yyyy-MM-dd); 如果两个线程都执行下列操作: String dateStamp = dateFormat.format
  • 线程访问静态方法中的静态变量

    千次阅读 2017-09-04 00:39:59
    背景:近期,项目中遇到一个场景,多线程访问一个数组,...下标的数值由一个静态变量共享。当时是这么写的,没有考虑多线程的问题: public class AppUtils { private final static int LIMIT = 10; private final
  • Java中的变量类型根据不同的标准可以分为两类,如果以其引用的数据类型的不同来区分可分为“原始数据类型变量和引用数据类型变量”,如果以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”。...
  • Java static(一) - 静态变量

    千次阅读 2017-10-14 00:47:31
    方法区(永久代)与Java堆一样,是各个线程共享的内存区域,它用于存储已经被虚拟机加载类的类信息、常量、静态变量(static variable)等 2. static变量被static修饰的类的变量,也称为静态变量。非静态变量也称为...
  • 比如: public class Main { public static void main(String[] args) { new MyThread().start();...//获取当前线程名字 System.out.println(na+"正在发售第"+tickets+"张票"); } } } }
  • (一)静态变量线程非安全 1、静态变量:使用static关键字定义的变量。static可以修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的...
  • JAVA线程——共享变量

    千次阅读 2018-11-12 10:53:09
    【转载】Java线程编程:变量共享分析(Thread) 原博客网址:https://www.cnblogs.com/xudong-bupt/archive/2013/05/22/3087864.html 今天看到java的多线程,感到十分激动,之前就在python中使用过多...
  • 局部变量不存在线程安全问题。 静态变量在该类的所有实例之间共享,如果会进行修改的话会有线程安全问题。 全局变量在单例时会有线程安全问题,多例时不存在。...
  • java线程变量共享

    千次阅读 2012-03-21 13:03:13
    import java.util.Random; public class StaticTest { private static int data = 0; public static void main(String[] args) { //开三个线程 for(int i=0;i;i++) { new Thread(new Runnable() {
  • 静态变量和实例变量的区别? 1)静态变量属于类,该类不生产对象,通过类名就可以调用静态变量。  2).实例变量属于该类的对象,必须产生该类对象,才能调用实例变量。  静态变量存储在方法区,属于类所有.实例...
  • 【自己的总结】 package dc.stock; import dc.stock.policies.StockP1_1_... * 之所以单独列出来,是为了多线程的使用; */ public class MainRunStockPolicy { public static void main(String[] args...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 257,470
精华内容 102,988
关键字:

java线程静态变量

java 订阅