Java线程基本知识

实现多线程的方式有两种:一种时候继承Thread的类,一种是实现Runnable接口。

Thread的类实现了Runnable接口,他们之间具有多态关系。

非线程安全:指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改,值不同步的情况,进而影响程序的执行流程。

解决非线程安全的问题使用的是synchronized关键字。

currentThread()方法可返回代码段正在被那个线程调用的信息。

isAlive()的功能是判断当前的线程是否处于活动状态。

sleep()方法是指在指定的毫秒数内让当前“正在执行的线程”休眠(暂定执行),这个“正在执行的线程”是指 this.cuurentThread()返回的线程。

getId()方法的作用是取得线程的唯一标识。

在Java中有以下3种方法终止正在运行的线程。

1> 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

 2>使用stop方法强制终止线程,但是stop和suspend及resume一样,都是作废过期方法。

3>使用interrupt方法中断线程。

判断线程是否是停止状态:

this.interrupted():测试当前线程是否已经中断。此方法还具有清除状态的功能。

this.isInterrupted():测试线程是否已经中断,没有清除状态的功能。

yield()方法的作用是放弃当前的cpu资源,将它让给其他的任务去占用CPU执行时间,放弃的时间不确定,有可能刚刚放弃,又马上获得CPU的时间片。

线程优先级:在操作系统中,线程可以划分为优先级,优先级高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。

设置线程的优先级使用的方法是setPriority()方法,在Java中线程的优先级分为1~10这10个等级,如果小于1或大于10,就会抛出异常throw new IllegalArgumentException();

在Java中,线程的优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A是一样的。

线程的优先级具有一定的规则性,也就是CPU尽量将执行资源让给优先级比较高的线程。

线程的优先级还具有随机性,也就是优先级较高的线程不一定每一次都执行完。

在Java中有两种线程,一种是用户线程,一种是守护线程。

守护线程是一种特殊的线程,他的特性有“陪伴”的含义,当进程中不存在非守护线程,则守护线程自动销毁。

“非线程安全” 问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全” 问题。

如果多个线程共同访问一个对象中的实例变量,则有可能出现“非线程安全”问题。

关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以得到该对象的锁的。

“可重入锁”:自己可以获取自己的内部锁。当存在父子类继承关系时,子类是完全可以通过“可重入锁”调用父类的同步方法的。

当一个线程执行的代码出现异常时,其所持有的锁会自动释放。

在使用synchronized关键字来声明方法时从运行时间来看很耗时,解决这样的问题可以使用synchronized同步块。

当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一段时间内只能有一个线程被执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

关键字volatile 的主要作用是使用变量在多个线程间可见。强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。缺点是不支持原子性。

volatile 与synchronized 的比较

volatile 是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。

多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。

volatile能保证数据的可见性,但不会保证原子性,而synchronized可以保证原子性,也可以简接保证可见性,因为它会将私有内存和公共内存中的数据做同步

volatile解决的是变量在多线程之间的可见性,而synchronized关键字解决的是多个线程之间访问资源的同步性。

线程的安全包含原子性和可见性两个方面,Java的同步机制都是围绕这两个方面来确保线程安全的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值