java中线程安全的定义,实现等

线程安全的定义:

当多个线程访问某个类时,不管运行时环境采用何种调度方式活着这些线程如何交互执行,并且在主调用代码中不需要任何额外的同步或者协同操作,这个类都能表现出正确的行为,那么这就称这个类是线程安全的

线程安全的类中,封装了必要的同步机制,因我们的主调用代码并不需要进一步的采取同步措施

竞态条件:

由于不恰当的执行时序,而出现的不正确的结果,就是竞态条件,举个例子:a线程需要将i的原始值加一赋予i,b线程需要将a线程执行后的i再+1,赋予j,这个时候如果b线程先执行,那么只鹅个结果就是错误的,这就产生了竞态条件

加锁机制:

为了保证多线程操作中,我们需要的某些调用保持原子性,就需要在单个原子操作中更新所有相关的状态变量

java中锁加锁机制:

1)内置锁:synchronized关键字就是java中的一种内置锁

2)重入:重入锁意味着获取锁的操作的粒度是线程,而不是调用。同一个线程可以无限制的获取同一个锁,重入的实现方法是:在线程调用的时候,为每一个锁关联一个获取计数值和一个所有者线程。计数为0为时认为释放了锁或者未有线程持有锁,一个线程获取了这个锁,就计数+1,并且记录该线程

重入的典型应用就是,子类继承父类synchronized方法,这时,执行子类方法就会先获取父类上的锁,那么在super.dosomthing时,就会无法获取父类上的锁,就会产生死锁

Volatile变量:

当把一个变量声明为volatile类型后,编译和运行时都会注意到这个变量时所有线程共享的,就不会把该变量值存入寄存器中或者其他线程看不见的地方,这就意味着,你每次读区volatile变量的时候,都是读取的是内存中最新的值,如果该变量做了任何修改,同样的也会立刻写入内存中,这就保证了其他线程也能立刻发现该变量值的改变

但是它只是一种稍弱的同步机制,volatile变量只能确保可见性,并不能保证多线程调用下对volatile变量操作的原子性

线程池的使用:

1.线程池不适用于依赖性任务,对响应时间比较敏感的任务和ThreadLocal的任务

1)线程池中的线程没有执行顺序,一半谁抢到了cpu资源谁就可以执行,所以如果线程中有一个线程依赖于另一个线程的执行结果,那么不适用于线程池,如果使用了l l l777k ljoin方法,使这个线程依赖于另一个线程的结果,那么在线程池固定大小的情况下,可能会产生饥饿性死锁

2)线程执行需要时间,如果用户需要及时反馈,那也不适用于线程池

3)ThreadLocal使得每个线程都可以拥有某个变量的一个私有版本,如果线程使用中,线程大小并不固定,那么使用ThreadLocal就并不明智

4)在线程池中建议不要放置运行时间长短不一至的线程

2.设置线程池大小:

线程池的理想大小取决于任务类型和系统特性

计算型任务和IO型任务

计算密集型CPU和IO密集型CPU

3.配置ThreadPoolExecuteor

ThreadPoolExecuteor实现了Executor,这些Executor是由Executors中的工厂方法返回的,灵活稳定线程池,允许自己定制线程(newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool等)

CorePoolSize:核心线程数

MaximumPoolSize: 最大大小

keepAliveTime: 当线程数大于核心线程数时,keppAliveTime就是多余的空闲线程等待的时间,如果在此期间并无任务,则回收该线程

unit:keepAliveTime参数的时间单位

BlockingQueue<Runnable> workQueue:如果所有线程数都处于忙碌状态,那么新建立的线程会存储在队列中

原文地址:https://www.cnblogs.com/jeasGo/p/12236126.html

时间: 2024-12-01 17:22:31

java中线程安全的定义,实现等的相关文章

Java中线程(Thread)知识概括

Java中线程(Thread)知识概括 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程. 例如:Java VM 启动的时候会有一个进程java.exe.该进程中至少一个线程负责java程序的执行,而且这个线程运行的代码存在于main方法中.该线程称之为主线程.jvm启动不止一个线程,还有负责垃圾回收机制等线程. 如何在自定义的代码中,自定义一个线程呢

java中线程池

在jdk1.5中加入了java.util.concurrent,这个包中主要介绍java中线程以及线程池的使用 现在看怎么创建一个线程池,在java中Executors类创建线程池的,而线程池分为三类, 1:Executors.newFixedThreadPool(3);//这是固定的线程池 2: Executors.newCachedThreadPool();创建一个带缓存的线程池,比如创建了3个线程在线程池中,但是现在有10个线程在执行任务,因此它还会创建7个线程 3:Executors.n

java中线程优先级是怎么回事给出一个例子

j6.线程优先级 (视频下载) (全部书籍) java中线程的优先级用1-10之间的数字表示,数值越大优先级越高,默认的优先级为5.Java中的线程优先级是在Thread类中定义的常量 NORM_PRIORITY : 值为5,MAX_PRIORITY :值为10,MIN_PRIORITY : 值为1,缺省优先级为 NORM_PRIORITY.有关优先级的常用方法有两个:1)final void setPriority(int newp) : 修改线程的当前优先级  2)final int get

Java中线程封闭之ThreadLocal

在访问共享数据时通常使用同步.若不使用同步则可以将对象封闭在一个线程中达到线程安全的目的,该方法称为线程封闭(Thread Confinement).其中实现线程封闭中规范的方法是使用ThreadLocal类.线程封闭技术一种常用的使用场景是在JDBC Connection对象. public class ConnectionHelper{private final static String URL = "";private final static ThreadLocal<C

多线程(三) java中线程的简单使用

============================================= 原文链接:多线程(三) java中线程的简单使用 转载请注明出处! ============================================= java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依旧是实现了Runnabel接口.考虑到java的

java中线程存活和线程执行的问题!

1 /* 2 下面的程序会出现下面的情况,当Thread-0, Thread-1, Thread-2都被wait的时候,可能会同时苏醒 3 Thread-0 put 4 Thread-1 put 5 Thread-2 put 6 Thread-3 get//在此处,Thread-3拿到锁之后,将所有的等待的线程唤醒,才有了下面的输出 7 Thread-2 put 8 Thread-1 put 9 Thread-0 put 10 */ 11 12 13 虽然多个线程会同时苏醒,但是只有一个能获得c

Java中线程同步的理解 - 其实应该叫做Java线程排队

Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等. 当多个线程同时读写同一份共享资源的时候,可能会引起冲突.这时候,我们需要引入线程"同步"机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团. 同步这个词是从英文synchronize(使同时发生)翻译过来的.我也不明白为什么

JAVA中关于数组的定义

前些日子,有网友问:在JAVA中 int[] a 这样定义的数组和 int a[] 定义的数组有什么区别? 当时没有细看,直接回复说,在JAVA中,两者是一样的,没有区别. 回头仔细看时,还是稍有区别的. 按照正常的JAVA编程规范,先定义类型 然后是变量名结束,由此说来 int[] a 是符合JAVA定义变量规范的(推荐用法):而 int a[] 则可能是为了兼容C++中的变量定义. 所以,来看下面几个数组定义的区别: int[] a; int b[]; int[] c []; int[] d

线程的生命周期 - 理解Java中线程的状态

刚刚开始学cocos2-x,仅仅是按照教程把已经安了一般Android的开发环境的eclipse重新升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 参考博客 D:\cocos2d-x\cocos2d-x-2.2.3\cocos2dx\platform\third_party\android\prebuilt 说说大概的过程: 下载ndk插件,ndk包,cdt插件.最开始我按照书上的下载了cocos2d-x 2.0.1,希望跟书上统一起来,这样以后学习的时候可以参考书上的也不会遇到太