如何保障java线程安全

什么是线程安全?给一段线程不安全的代码分析

指某个函数 、函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功能正确完成。
一般来说,线程安全的函数应该为每个调用它的线程分配专门的空间,来储存需要单独保存的状态,不依赖于“线程惯性”,把多个线程共享的变量正确对待,而且,线程安全的函数一般不应该修改全局对象。
很多C库代码不是线程安全的,在多线程环境中调用这些函数时,要进行特别的预防措施,或者寻找别的替代方案。

Thread safety is the process to make our program safe to use
in multithreaded environment, there are different ways through which we can make
our program thread safe.

  • Synchronization
    is the easiest and most widely used tool for thread safety in
    java.

  • Use of Atomic Wrapper classes
    from java.util.concurrent.atomic
    package. For example AtomicInteger

  • Use of locks from
    java.util.concurrent.locks package.

  • Using thread safe collection
    classes, check this post for usage of ConcurrentHashMap
    for thread safety.

  • Using volatile keyword with variables
    to make every thread read the data from memory, not read from thread
    cache.

非线程安全!=不安全

有人在使用过程中有一个不正确的观点:我的程序是多线程的,不能使用ArrayList要使用Vector,这样才安全。

非线程安全并不是多线程环境下就不能使用。注意我上面有说到:多线程操作同一个对象。注意是同一个对象。比如最上面那个模拟,就是在主线程中new的一个ArrayList然后多个线程操作同一个ArrayList对象。如果是每个线程中new一个ArrayList,而这个ArrayList只在这一个线程中使用,那么肯定是没问题的。

Java provide multi-threaded environment support using Java
Threads
, we know that multiple threads created from same Object share object
variables and this can lead to data inconsistency when the
threads are used to read and update the shared data.

The reason for data inconsistency
is because updating any field value is not
an atomic process, it requires three steps; first to read the current
value, second to do the necessary operations to get the updated value and third
to assign the updated value to the field reference.

Let’s check this with a simple program where multiple threads are updating
the shared data.





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

package com.journaldev.threads;

public class ThreadSafety {

public static void main(String[] args) throws
InterruptedException {

ProcessingThread pt =
new ProcessingThread();

Thread t1 = new
Thread(pt, "t1");

t1.start();

Thread t2 = new
Thread(pt, "t2");

t2.start();

//wait for threads to
finish processing

t1.join();

t2.join();

System.out.println("Processing
count="+pt.getCount());

}

}

class ProcessingThread implements Runnable{

private int count;

@Override

public void run() {

for(int i=1; i< 5;
i++){

processSomething(i);

count++;

}

}

public int getCount() {

return this.count;

}

private void processSomething(int i) {

// processing some
job

try {

Thread.sleep(i*1000);

} catch
(InterruptedException e) {

e.printStackTrace();

}

}

}

In above program for loop, count is incremented by 1 four times and
since we have two threads, it’s value should be 8 after both the threads
finished executing. But when you will run above program multiple times, you will
notice that count value is varying between 6,7,8. This is happening because even
if count++ seems to be an atomic operation, its NOT
and causing data corruption.

如何保障java线程安全

时间: 2024-10-12 01:26:48

如何保障java线程安全的相关文章

Java线程使用大全

1.线程实现 1.Thread类 构造方法: 案例代码: public class Ex10_1_CaseThread extends Thread {// 创建一个类继承(extend)Thread类 String studentName; public Ex10_1_CaseThread(String studentName) {// 定义类的构造函数,传递参数 System.out.println(studentName + "申请访问服务器"); this.studentNam

Java线程:概念与原理

一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. "同时"执行是人的感觉,在线程之间实际上轮换执行. 二.Java中的线程 在J

Java线程:创建与启动

Java线程:创建与启动 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法:否则,该方法不执行任何操作并返回.   Thread 的子类应该重写该方法. 2.实现java.lang.Runnable接口. void run() 使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独

Java线程:线程状态的转换

Java线程:线程状态的转换 一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法. 2.可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态.当start()方法调用时,线程首先进入可运行状态.在线程运行之后或者从阻塞.等待或睡眠状态回来后,也返回到可运行状态. 3.运行状态:线程调度程序从可运行池中选择一个线程作为当前

java线程详解

Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav

Java线程详解(一)

程序.进程.线程的概念  程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象.  进程(process):是程序的一次执行过程,或是正在运行的一个程序.动态过程:有它自身的产生.存在和消亡的过程.     如:运行中的QQ,运行中的MP3播放器     程序是静态的,进程是动态的  线程(thread):进程可进一步细化为线程,是一个程序内部的一条执行路径.     若一个程序可同一时间执行多个线程,就是支持多线程的 Java中多线程的创建和使

适用于即时系统并发编程的新的java线程模型,记我的第一篇英文翻译

1:介绍:      传统意义上的即时系统是有经验的专家的领域,因为他们能处理多种定制的内核,非标准的并且大多数是低级的语言,供应商提供的定制的I/O接口.这就要求有一种新的java线程模型来解决这种状况,这种模型解决当前及时嵌入系统的四个缺陷:安全,性能,可移植性.程序调试时间.安全是当前编程语言和及时系统在复杂性与定义不清的接口上折中的办法,这些语法不能成为正式的保证系统安全的语法:性能受到威胁是因为工程师必须接受及时系统所提供的无论什么级别的操作,如果那些操作过高或过低都会导致非必要的日常

java 线程基本用法

java中的多线程 一.      java 线程基本介绍 1.进程与线程的区别 进程是指一个内存中运行的应用程序,每个进程都有一块独立的内存空间,一个进程包含一到多个线程. 每个线程都有他所属的进程,每个线程也就是该进程的一条执行路径,线程之间是高频率快速轮换执行的,‘同时’执行只是给人的感觉. 2.Java当中线程一般有5中状态 创建状态:生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态. 就绪状态:当调用了线程的start方法,线程就进入就绪状态,调用start方法后线

Java线程详解----借鉴

Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav