多线程下处理变量共享的几种方式

1.尽量将共享变量(共享变量指的是在堆内存上创建的对象或者数组,包括成员变量、静态变量和数组元素。)定义为局部变量。

2.如果多线程只是读取变量,可以定义全局final。

3.使用ThreadLocal将变量创建为线程私有。

4.加锁

public class Increment {

    private int i;

    public void increase() {
        synchronized (this) {   //使用this作为锁
            i++;
        }
    }

    public static void anotherStaticMethod() {
        synchronized (Increment.class) {   //使用Class对象作为锁
            // 此处填写需要同步的代码块
        }
    }
}

锁的重入指的是:当一个线程请求获得已经被其他线程获得的锁的时候,它就会被阻塞,但是如果一个线程请求一个它已经获得的锁,那么这个请求就会成功。

原文地址:https://www.cnblogs.com/hongchengshise/p/10409815.html

时间: 2024-10-28 04:51:51

多线程下处理变量共享的几种方式的相关文章

进程间共享句柄三种方式

windows核心编程第三章中,句柄的共享讲了三种方式 1.在创建句柄的时候,设置可继承,在创建进程时,让子进程继承句柄, 然后通过各种途径(如命令行参数.环境变量.发送消息)让子进程知道即可.2.复制句柄,得先知道目的进程,然后在目标进程中复制句柄, 最后通过各种途径(如发送消息)通知目标进程3.给句柄命名,进程间相互知道名字即可. 第3种在使用Mutex限制只运行一个实例时已使用,前2种没有例子,因此自己写了个实例. 运行后,点击创建进程,会创建一个文件句柄,并置为可继承,然后创建一个环境变

多线程下解决资源竞争的7种方法

前言 一般情况下,只要涉及到多线程编程,程序的复杂性就会显著上升,性能显著下降,BUG出现的概率大大提升. 多线程编程本意是将一段程序并行运行,提升数据处理能力,但是由于大部分情况下都涉及到共有资源的竞争,所以修改资源 对象时必须加锁处理.但是锁的实现有很多种方法,下面就来一起了解一下在C#语言中几种锁的实现与其性能表现. 一.c#下的几种锁的运用方式 1.临界区,通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 1 private static object obj =

多线程之线程间协作的两种方式:wait、notify、notifyAll和Condition

Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对

JDK的path环境变量配置(两种方式)

1 path环境变量的作用及配置方式1 1.1 path环境变量的作用 1) 在JDK的bin目录下开发程序容易产生的问题 如果文件过多,不方便管理: 删除自己写过的不需要的文件,可能不小心把JDK自带的工具给删除了. 2) 如何解决问题呢 notepad这样的命令为什么在任何路径下都能够执行,原因是配置path环境变量. path配置的是可执行的文件.exe,配置后可以在不同的盘符下访问path路径下的这些可执行文件. 1.2 Path环境变量的配置方式1 右键点击桌面计算机→选择属性→选择高

node.js 下依赖Express 实现post 4种方式提交参数

上面这个图好有意思啊,哈哈, v8威武啊.... 在2014年的最后一天和大家分享关于node.js 如何提交4种格式的post数据. 上上一篇说到了关于http协议里定义的4种常见数据的post方法 ,详细介绍请点击查看. 分别是这四种: www-form-urlencoded, form-data, application/json, text/xml Express 依赖 bodyParser 对请求的包体进行解析,默认支持:application/json, application/x-

Java多线程Thread使用匿名内部类创建的两种方式

匿名内部类实现线程的两种方式: 第一种方式: 1.继承Thread类 2.重写run方法 3.将要执行的代码写在run方法中 第二种方式: 1.将Runnable的子类对象传递给Thread的构造方法 2.重写run方法 3.将执行的代码写在run方法中,最后我们开启线程 package com.yyx.thread; /** * 匿名内部类创建线程 yyx 2018年2月4日 */ public class AnonymousThread { public static void main(S

关于java多线程任务执行时共享资源加锁的方式思考

1.加锁方式: 1-1.使用synchronized关键字进行方法或代码块的加锁方式 1-2.使用ReentrantLock类提供的lock()方法的方式 2.代码实现(传统的银行取款存款问题): 2-1.Account.java类:账户类 package com.java.thread; import java.util.concurrent.locks.ReentrantLock; /** * 账户类 * @author steven * */ public class Account {

干货分享-Linux(RedHat/CentOS)下root密码找回的三种方式

一.第一种方式 1.开机. 2.插入光盘. 3.进入BIOS模式,调整光盘为第一启动项,保存并重启. 4.选择第三项"Rescue installed system",点击回车. 5.选择语言和键盘. 6.是否启动网络,选择不启动. 7.点击继续. 8.点击OK. 9.点击OK(大致意思:你的系统已经挂载到/mnt/sysimage目录) 10.选择第一行,进入SHELL,并点击OK. 11.检查root是否存在. 12.编辑配置文件,删掉第一行的x(光标移动到x底下,点击键盘上的de

[Java] 多线程下生产者消费者问题的五种同步方法实现

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题. 生产者消费者模式的优点 - 解耦 - 支持并发 - 支持忙闲不均 解决方法可分为两类: (1)用信号量和锁机制实现生产者和消费者之间的同步: - wait() / notify()方法 - await() / signal()方法 - BlockingQueue阻塞队列方法 - Semaphore方法 (2)在生产者和消费者之间建立一个管道.(一般不使用,缓冲区不易控制.数据不易封装和传输) - PipedInputStream