精华内容
下载资源
问答
  • 局部静态变量多线程问题

    千次阅读 2014-06-26 20:46:23
    局部静态变量多线程问题


    静态局部变量实在第一次访问的时候进行初始化的,先来看下初始化的过程

    class base
    {
    public:
    	base(){}
    };
    
    void fn()
    {
    	static base t;
    }
    

    首先定义一个类; 初始化过程的汇编



    首先取出一个值和1进行比较 ,如果不等把1 复制给这个地址 然后调用base的构造函数进行初始化

    根据上下文 可以理解 其实这个地址就是来标记该静态变量是否进行过初始化,如果没有置为1,然户进行初始化。如果为1,则跳过初始化。


    下面考虑多线程的环境当线程1 在赋值标志位之前判断标志位之后,切换到线程2,线程2也会判断为未初始化,则 这种情况下base会初始化两次,考虑一种情况,如果构造函数里有申请内存的操作则析构时只会析构后者。会造成内存泄露~ 所以多线程的局部静态变量的初始化也是不安全的~ 



    展开全文
  • 其中askedCount 是静态变量多线程访问导致askedCount 结果不对,因为静态变量再被多个线程修改时其实是修改的同一个变量 导致 在返回前值被修改。 改正方式是 把askedCount 声明成静态变量。 public static ...

    其中askedCount 是静态变量,多线程访问导致askedCount 结果不对,因为静态变量再被多个线程修改时其实是修改的同一个变量

    导致 在返回前值被修改。

    改正方式是 把askedCount 声明成静态变量。

    public static Long getAskedCount() {



    String beginTime;
    Date beginDate = new Date();
    askedCount = -1L;


    if (GameDynamicElement.getAskTime() != null) {
    SimpleDateFormat df = null;
    df = new SimpleDateFormat("yyyy-MM-dd");
    beginTime = df.format(new Date());
    beginTime = beginTime + " " + GameDynamicElement.getAskTime();
    } else {
    beginTime = null;
    }


    if (StringUtils.isNotEmpty(beginTime)) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
    beginDate = sdf.parse(beginTime);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    // 时差
    askedCount = System.currentTimeMillis() - beginDate.getTime();


    if (askedCount > 0) {


    askedCount = (askedCount / (GameDynamicElement.getSpaceTime() * 1000)) + 1;
    }
    }
    return askedCount;
    }
    展开全文
  • 局部变量不存在线程安全问题。 静态变量在该类的所有实例之间共享,如果会进行修改的话会有线程安全问题。 全局变量在单例时会有线程安全问题,例时不存在。...

    局部变量不存在线程安全问题。

    静态变量在该类的所有实例之间共享,如果会进行修改的话会有线程安全问题。

    全局变量在单例时会有线程安全问题,多例时不存在。

    展开全文
  • 我们先来讨论一个问题,一个类的静态变量当类被次实例化的时候,静态变量是否会受影响?首先我们应该清楚的是静态变量是在类被JVM classloader的时候分配内存,并且是分配在永久区而非堆内存中。 当我们用对象锁来...

    我们先来讨论一个问题,一个类的静态变量当类被多次实例化的时候,静态变量是否会受影响?首先我们应该清楚的是静态变量是在类被JVM classloader的时候分配内存,并且是分配在永久区而非堆内存中。

    当我们用对象锁来同步静态变量的时候,我们来看一个例子。
    public interface OrderService {

    public String getOrderNo();

    }
    先定义一个接口,获取一个订单编号。
    public class OrderLockServiceImpl implements OrderService {

    static int num = 0;
    @Override
    synchronized public String getOrderNo() {
        SimpleDateFormat date = new SimpleDateFormat("YYYYMMDDHHMMSS");
        return date.format(new Date()) + num++;
    }

    }
    实现这个接口,并且用对象方法来操作静态变量。
    public class OrderTask implements Runnable {

    private CountDownLatch latch;
    private OrderService orderService;
    public OrderTask(CountDownLatch latch,OrderService orderService) {
        this.latch = latch;
        this.orderService = orderService;
    }
    
    @Override
    public void run() {
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("线程名%s订单号:%s\n",Thread.currentThread().getName(), orderService.getOrderNo());
    }

    }
    创建一个线程类,使用CountDownLatch来让每一个线程都有出现的机会,而不是某一个线程独占。
    public static void main(String[] args) {
    ExecutorService service = Executors.newCachedThreadPool();
    final CountDownLatch latch = new CountDownLatch(1);
    for (int i = 0;i < 10;i++) {

      OrderService orderService = new OrderLockServiceImpl();
      service.submit(new OrderTask(latch,orderService));

    }
    latch.countDown();
    service.shutdown();
    }
    最后实现main方法,用线程池来提交10次线程任务。结果我们发现,这个静态变量会出现重复(并不是每一次运行都会重复)

    线程名pool-2-thread-1订单号:20180719619072331
    线程名pool-2-thread-7订单号:20180719619072337
    线程名pool-2-thread-3订单号:20180719619072337
    线程名pool-2-thread-9订单号:20180719619072336
    线程名pool-2-thread-5订单号:20180719619072335
    线程名pool-2-thread-6订单号:20180719619072334
    线程名pool-2-thread-10订单号:20180719619072333
    线程名pool-2-thread-4订单号:20180719619072330
    线程名pool-2-thread-2订单号:20180719619072332
    线程名pool-2-thread-8订单号:20180719619072338

    由此我们可以断定,对象锁并不能保证静态变量的同步安全。不过如果对象在堆内存中是唯一的,如
    public static void main(String[] args) {
    ExecutorService service = Executors.newCachedThreadPool();
    final CountDownLatch latch = new CountDownLatch(1);
    OrderService orderService = new OrderLockServiceImpl();
    for (int i = 0;i < 10;i++) {

      service.submit(new OrderTask(latch,orderService));

    }
    latch.countDown();
    service.shutdown();
    }
    则无论你运行多少次,则静态变量也一定是同步的。

    但是如果我们使用的是类锁,来改进上面的代码。
    public abstract class AbstractOrderService implements OrderService {

    static int num = 0;
    public static synchronized String getOrderNo2() {
        SimpleDateFormat date = new SimpleDateFormat("YYYYMMDDHHMMSS");
        return date.format(new Date()) + num++;
    }
    @Override
    public String getOrderNo() {
        return getOrderNo2();
    }

    }
    抽象类中使用静态方法,来同步静态变量。
    public class OrderLockServiceImpl extends AbstractOrderService {

    }
    我们在子类中什么都不做,只继承于抽象类

    此时我们即便实例化10个对象
    for (int i = 0;i < 10;i++) {
    OrderService orderService = new OrderLockServiceImpl();
    service.submit(new OrderTask(latch,orderService));
    }
    其结果依然无论运行多少次,都不会出现重复订单号,因为这里已经使用了类锁来同步静态变量。

    展开全文
  • final 静态变量线程安全

    千次阅读 2019-01-08 16:30:44
    我的代码中已经次使用了线程,然后还非常喜欢使用据说是线程不安全的静态方法,然后又看到很地方最容易提的问题就是这个东西线程不安全   于是我不免产生了以下几个亟待解决的问题: 什么样的代码是天生线程...
  • 多线程访问静态方法中的静态变量

    千次阅读 2017-09-04 00:39:59
    背景:近期,项目中遇到一个场景,多线程访问一个数组,...下标的数值由一个静态变量共享。当时是这么写的,没有考虑多线程的问题: public class AppUtils { private final static int LIMIT = 10; private final
  • 在c++11中,static静态类对象在执行构造函数进行初始化的过程是线程安全的。 #include #include using namespace std; class Cnum { public: Cnum() { std::cout << “construct start” << std::endl...
  • 类的静态变量线程不安全的

    千次阅读 2016-11-08 19:46:27
    多线程
  • java类全局静态变量多线程中数据混乱问题 解决方法: 可以使用ThreadLocal实现线程内的数据共享,而在另外线程中运行时又共享另外一份数据。 用法:http://www.yayihouse.com/yayishuwu/chapter/1174
  • 静态变量实现线程之间的资源共享--以HelloCharts折线图为例问题描述解决思路代码获取数据的线程监听获取数据线程的另一个线程总结 问题描述 这周进行的实训遇到一个问题,即有两个activity都需要获取服务器传来的...
  • 多线程静态变量,普通变量(实例变量),局部变量,静态方法,普通方法 的线程安全问题 类型 是否安全 存储位置 解释 静态变量 线程不安全 方法区 静态变量为类所持有,为所有对象共享,全局只有一份,...
  • 在cs(c#)系统时会用到很多的多线程泛型静态集合变量,尤其是会在很多的线程中同时使用这些静态变量,这种时候该怎么做呢?网上有的人说用队列比较好,但是队列的操作非常的不灵活。如果你只有多线程读取和多线程的...
  • java线程共享变量与静态变量

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

    千次阅读 2013-04-27 13:58:58
    曾经以为,多线程可以访问静态变量,来实现多线程之间数据的共享。 事实上,虽然多线程可以访问静态变量,但是,会有延迟,可能访问的并不是最新的值。 要想在多个线程之间共享数据,并能及时访问到最新值,需要用...
  • 数据库连接池一定会遇到线程安全问题,连接池可能会被线程同时访问,我在写连接池时,连接池是单例模式,参数和方法都是静态的,在测试过程中发现静态方法也会存在线程安全问题,然后通过查阅资料,得到了一些...
  • JAVA 多线程编程 安全结论: 静态变量:线程非安全。...实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其
  • 对于多线程中的全局静态变量,如果每个线程都会使用到而且要改变变量值里,要对变量操作进行锁定,否则会出现在不同线程获取的变量值不相同的情况。
  • c#多线程应用和静态变量

    千次阅读 2010-12-26 10:19:00
    在c#开发过程中,不可避免要用到多线程。当在子线程中访问主UI线程中的控件时,可以用委托,控件的invoke等。也可以设置全局静态变量CheckForIllegalCrossThreadCalls:CheckForIllegalCrossThreadCalls = false;//...
  • 多线程请求给静态变量加锁的

    千次阅读 2019-12-25 18:36:08
    今天在写一个当每次请求过来定义的一个静态变量累加的时候遇到很多坑,发现自己对多线程和锁的理解和使用一窍不通,对Java一些设计模式真的是一知半解!!心生惭愧,感谢部门大佬耐心的讲解和帮助!让我也明白写程序...
  • 静态变量多线程中的使用问题

    千次阅读 2013-05-17 09:57:17
    1、现象:问题描述  用户登陆门户网站页面后,通过SSO(single sign on)访问另一个... 2、关键过程:根本原因分析  经过代码分析发现,用户通过SSO接口登陆网站时,在登陆模块的类中使用了静态属性LOGINURL来
  • 静态方法和静态成员变量多线程

    千次阅读 2015-11-01 11:49:26
    体会: public class Easy { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); MyThread t3 = new MyThread(); t1.start();... t3.st
  • Java多线程编程中,存在很多线程安全问题,至于什么是...此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量
  • 1. 静态变量线程不安全 静态变量位于方法区,为所有对象共享,它们共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程不安全。 public class Test1 implements Runnable { private static int ...
  • //夸线程访问,取出静态变量的值放入放入父窗体的TEXTBOX控件中显示 } }); thread.Start();//启动线程 } } } 3 子窗体 using System; using System.Collections.Generic; using System....
  • 私有静态成员变量,在多线程环境,别的线程会修改当前线程的变量
  • 创建线程时,线程函数如果要设置成类的成员函数,则必须是静态成员函数,在此函数种不能使用非静态成员变量,如果要使用非静态成员变量,则一种比较适合线程的方法是:建立线程的时候把this作为CreateThread的一个...
  • C++当中常常需要一个全局唯一的对象... 既然全局变量是可能有害的,那么,我们我们把它隐藏一下,放到某个类当中去,作为类的静态数据成员。这看上去不错,我也这么认为。当我们只是简单的需要一个全局对象时,这很
  • 当字段被ThreadStatic特性修饰后,它的值在每个线程中都是不同的,即每个线程对static字段都会重新分配内存空间,就当然于一次new操作,这样一来,由于static字段所产生的问题也就没有了,这种static数据上下文是...
  • 静态方法如果没有使用静态变量,则没有线程安全问题。 因为静态方法内声明的变量,每个线程调用时,都会新创建一份,而不会共用一个存储单元。比如这里的tmp,每个线程都会创建自己的一份,因此不会有线程安全问题。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 333,541
精华内容 133,416
关键字:

静态变量多线程