线程三线程安全

线程三线程安全
对于多线程的系统来说,如果不加以限制的话,会造成数据安全等问题,对于数据安全问题会有如下问题:
1、读取脏数据 在读取数据的时候,数据被修改了,而程序读取的是修改过的或者没有修改过的,反正不是自己期望读取的数据的值。
2、数据不一致 在使用多线程进行数据处理的时候,最终得出来的数据每一次执行都不一样。
3、数据错乱 在数据的打印或者数组中,会造成数据的顺序错乱,对于关系可能会错乱。
……
对于数据的安全性,java提供了一些解决的方法:
1、使用synchronized同步关键字
2、使用volatile关键字
3、使用原子类型:原子就是要么全部成功,要么全部失败
(1)AtomicInteger整型原子类型
方法讲解:
incrementAndGet();先自增在返回
decrementAndGet();先自减在返回
getAndIncrement();先返回在自增
getAndDecrement();先返回在自减
addAndGet(num);先加num在返回
getAndAdd(num);先返回在加num
(2)AtomicBoolean布尔类型的原子类型
getAndSet(Boolean b);先获取在设置b值
(3)AtomicLong长类型的原子类型
incrementAndGet();先自增在返回
decrementAndGet();先自减在返回
getAndIncrement();先返回在自增
getAndDecrement();先返回在自减
addAndGet(num);先加num在返回
getAndAdd(num);先返回在加num
(4)AtomicIntegerArray 原子类型的整型数组
(5)AtomicLongArray 原子类型的长整型数组
原子数组操作:
set(seat,value);设置值
getAndAdd(seat, value);将seat值返回在加上value
getAndIncrement(seat);将seat值返回在自增1
4、线程安全的容器ConcurrentMap,ConcurrentHashMap等等。
……
在考虑线程的数据安全性后,还要考虑系统是否会造成死锁的,饥饿等问题。
死锁:就是在两种以上不同的线程中,同时都占用了一个资源,但是还差一个资源就可以完成任务,但是差的那个已经被别的线程占有,又不想释放自己占有的资源,这样,线程一直在等待资源,造成线程死锁。
饥饿:就是在考虑的线程优先级的时候,低优先级的线程一直不能得到执行完成而造成的现象称为饥饿。
简单代码:
AtomicIntegerArray aia = new AtomicIntegerArray(10);
for(int i=0;i<10;i++) {
aia.set(i, i+1);
}
aia.getAndAdd(9, 10);
aia.getAndIncrement(8);
for(int i=0; i<10;i++) {
System.out.println(aia.get(i));
}

原文地址:http://blog.51cto.com/xiaoshunzi/2350384

时间: 2024-10-09 07:55:43

线程三线程安全的相关文章

MFC线程(三):线程同步事件(event)与互斥(mutex)

前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFun{ hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); SetEvent(hEvent); char g_charArray[4]; CString szResult; //下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问 AfxBe

java中进程与线程--三种实现方式

一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程是指处于运行过程中的程序,并且具有一定的独立功能.进程是系统进行资源分配和调度的一个单位.当程序进入内存运行时,即为进程. 进程的三个特点: 1:独立性:进程是系统中独立存在的实体,它可以独立拥有资源,每一个进程都有自己独立的地址空间,没有进程本身的运行,用户进程不可以直接访问其他进程的地址空间. 2:

Java当中的线程(三)

1. 多线程的数据安全 2. 同步线程的方法 1. 多线程的数据安全 1 class MyThread implements Runnable{ 2 int i = 100; 3 public void run(){ 4 while(true){ 5 System.out.println(Thread.currentThread().getName()+i); 6 i--; 7 Thread.yield(); 8 if(i<0){ 9 break; 10 } 11 } 12 } 13 } 1 c

C#中的线程(三) 使用多线程

第三部分:使用多线程 1.  单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留下的模型,但很多时候它也会突然出现,这是因为有必要 与旧的API 进行通信.单元模式线程与Windows Forms最相关,因为大多Windows Forms使用或包装了长期存在的Win32 API——连同它的单元传统. 单元是多线程的逻辑上的“容器”,单元产生两种容量——“单的”和“多的”.单线

JAVA多线程(三) 线程池和锁的深度化

github演示代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/src/main/java/com/kawa/thread 1.线程池 1.1 线程池是什么 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务

多线程-线程一打印1,2,3,4,5线程二打印6,7,8,9,10,线程三打印11,12,13,14,15,...直到45结束

多线程-线程一打印1,2,3,4,5线程二打印6,7,8,9,10,线程三打印11,12,13,14,15,...知道45结束 public class Exam3{ public static void main(String[]args){ MyThread t1=new MyThread("线程一"); MyThread t2=new MyThread("线程二"); MyThread t3=new MyThread("线程三"); t1.

三线程加速无损视频解码

无损解码速度快,需要56ms(基于YUV和DCT的需要1.6s),经过优化,比如将for循环改为C语言自带的memcpy替换,提升到50ms,还不足于正常播放,因为1000ms/50ms=20帧峰值.为此需要提速,如果正常播放25帧视频,则需要可播放30帧的能力. 1. 对于图像提速可采用以下方法: 1.1 汇编方法:汇编可起到事半功倍的作用,但对于复杂的程序比如视频编码,转换很困难,需要时间和“汇编功力”. 1.2 图像分割方法:将图像“分割”为n等分区域,分别用线程同时运行,起到并行加速作用

基础学习day11--多线程一线程的创建,运行,同步和锁

1.1.进程和线程 进程:一个应用程序一般都是一个进程,正在进行的程序 每一个进程最少都有一个线程,都有一个执行顺序,该顺序是一个执行路径或者一个控制单元 线程:进程中一个独立的控制单元,线程控制着进程的执行. windows中的任务管理器,可以查看进程,linux下通过ps命令 线程是进程的最小单位 线程依赖于进程 线程随着进程的创建和创建,随着进程的结束而消亡 如迅雷:可以同时开启多个下载,就是多线程 多个程序同时执行,时CPU在很快的切换,看上去是同时执行,实际上是在CPU在切换执行. 多

猎豹MFC--进程和线程--创建线程AfxBeginThread() SetDlgItemInt()线程暂停继续终止

增加一按钮  双击: SPY++查看  进程下面的线程: 另一个线程函数: 定义一个指针变量: 在构造函数中初始化: 暂停线程: 线程继续: 定义布尔变量 记录 线程有没有在运行: 初始化该变量: 修改县城函数demoA: 对话框添加按钮,双击该按钮: 增加一个线程函数: 实现线程函数: 增加第2个按钮  掉用第二个线程函数:' 按了第一个按钮立马按第二个按钮时  也就是当两个线程并发执行时就会出错: 以上是线程同步的四种方法,是MFC的C++类 定义指针:指向临界区对象: 在构造函数中 创建临