全局变量(或者属性)的初始化问题

本文深入探讨了Java中全局变量的静态与动态初始化方法,包括基本数据类型、数组及引用类型的初始化策略,同时指出了常见的错误初始化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结:定义的全局变量(即类的属性)——数组、基本数据类型、其他引用类型变量,

  • 采用静态初始化方式,即定义变量的同时进行初始化;
  • 采用动态初始化方式,只在属性处定义变量,初始化放在方法中进行;
  • 错误操作:先定义属性中的变量,接着换行再进行初始化。(详细见下)

1.定义变量的时候,立刻初始化,即静态初始化;

public class Test {
    int a = 1;//静态初始化基本数据类型

    String[] s = {"Hello","World","你好,世界"};//静态初始化引用类型数组
    Example[] e = {new Example(2019,"小明"),new Example(2018,"小红")};

}
class Example{
    int id;
    String name;

    public Example(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

2.只定义,最后在方法中进行初始化;

public class Test02 {
    int a;
    String[] s;
    Example[] e = new Example[2];
    public void se(){
        a = 1;//动态初始化,必须在方法中,进行
        e[0] = new Example(2019,"小明");//同理,数组的动态初始化也必须在方法中进行,静态方法或者动态方法均可
        e[1] = new Example(2018,"小红")
    }
}
class Example{
    int id;
    String name;

    public Example(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

3、错误初始化操作(如下代码报错)

public class Test03 {
    int a;
    a = 1;//直接对全局变量(即属性),先定义,接着初始化,这是错误的
    String[] s;
    s = {"ab","cd","ef"};
    Example[] e = new Example[2];
    e[0] = new Example(2019,"小明");//同理,数组也不能这样初始化操作
    e[1] = new Example(2018,"小红");
}
class Example{
    int id;
    String name;

    public Example(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

 

转载于:https://www.cnblogs.com/pxb2018/p/10532865.html

<think>我们要静态初始化一个全局的线程锁数组。根据引用[1]和引用[2],静态初始化互斥锁可以使用宏PTHREAD_MUTEX_INITIALIZER,这个宏可以在编译时初始化互斥锁。对于数组,我们可以使用这个宏来初始化数组中的每个元素。注意:静态初始化的互斥锁不能使用pthread_mutex_destroy销毁,它们会一直存在直到程序结束。示例代码:```c#include<pthread.h>//声明并初始化一个全局的互斥锁数组,数组大小为3pthread_mutex_tmutex_array[3]={PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER};```这样,mutex_array数组中的每个互斥锁都被静态初始化了。注意:静态初始化只适用于普通互斥锁(默认属性),如果需要设置互斥锁属性(如递归锁、错误检查锁等),则需要使用动态初始化(调用pthread_mutex_init函数),但问题要求静态初始化。另外,根据引用[1],静态初始化的缺点之一是灵活性有限,无法定制属性。所以如果不需要特殊属性,静态初始化是合适的。同时,由于是全局变量,它会被初始化为0(即静态初始化),所以上面的写法是有效的。如果需要初始化一个较大的数组,可以使用循环(但注意静态初始化必须在编译时确定,所以不能使用运行时循环)。因此,如果数组很大,我们可以考虑使用宏或者编写脚本生成初始化列表。但通常数组大小固定,直接写出每个元素的初始化值。例如,如果数组大小为10,我们可以这样写:```cpthread_mutex_tmutex_array[10]={PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER};```但是这样写比较冗长,C99标准支持指定初始化(designatedinitializers)的扩展,但GCC支持使用重复次数的扩展(非标准):```c//GCC扩展,使用[0...9]=PTHREAD_MUTEX_INITIALIZERpthread_mutex_tmutex_array[10]={[0...9]=PTHREAD_MUTEX_INITIALIZER};```但是为了可移植性,建议使用标准C语法,即列出所有的初始化器。或者,如果不想手动写多个,可以写一个宏来生成,比如:```c#defineREPEAT_10(x)x,x,x,x,x,x,x,x,x,xpthread_mutex_tmutex_array[10]={REPEAT_10(PTHREAD_MUTEX_INITIALIZER)};```但最标准且可移植的还是手动列出。另外,在C++中,如果数组较大,可以在程序启动时使用一个函数来动态初始化(使用静态对象初始化),但注意问题要求静态初始化(即编译时初始化),所以这里不采用这种方法。总结:对于全局互斥锁数组的静态初始化,我们可以使用初始化列表,将每个元素用PTHREAD_MUTEX_INITIALIZER初始化。下面是完整示例(使用3个元素的数组):</think> ### C/C++ 全局变量线程锁数组静态初始化示例 在 C/C++ 中静态初始化全局互斥锁数组,可使用 `PTHREAD_MUTEX_INITIALIZER` 宏进行编译时初始化。以下是实现方法: ```c #include <pthread.h> // 声明并静态初始化全局互斥锁数组(含5个锁) pthread_mutex_t global_mutexes[5] = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER }; // 示例使用函数 void access_resource(int lock_index) { pthread_mutex_lock(&global_mutexes[lock_index]); // 访问共享资源... pthread_mutex_unlock(&global_mutexes[lock_index]); } ``` ### 关键说明: 1. **静态初始化**:每个数组元素使用 `PTHREAD_MUTEX_INITIALIZER` 初始化,不需要运行时调用 `pthread_mutex_init()`[^1][^2] 2. **内存位置**:数组需声明为全局变量或静态变量(程序启动时自动初始化) 3. **特性限制**: - 无法使用 `pthread_mutex_destroy()` 销毁(程序退出时自动释放)[^1] - 仅支持默认互斥锁属性(如需递归锁等特性需动态初始化)[^1] 4. **多线程访问**:线程安全,初始化在程序启动时完成[^2] ### 扩展说明: - 对于大型数组,可使用预处理宏简化: ```c #define INIT_MUTEX PTHREAD_MUTEX_INITIALIZER pthread_mutex_t big_array[50] = { [0 ... 49] = INIT_MUTEX }; // GCC扩展语法 ``` - C++11 更推荐使用 `std::array<std::mutex, N>` 实现型安全的锁数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值