进程:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
线程:在进程中独立运行的子任务。
在java中以下3种方法可以终止正在运行的线程:
1) 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止;[ 抛出异常,return都可以]
2) 使用stop方法强行终止线程,与suspend/resume(有独占,不同步的问题)都是过期的方法;
3) 使用interrupt方法中断线程。
[interrupted()并不能马上停止线程,相当于一个中断标志,再次执行能清除当前状态。isinterrupted()只测试不标记]
线程的优先级(Priority)
1) 继承性,A线程启动B线程,B与A优先级一样;2) 规则性,优先级高的线程获得更多资源;3) 随机性,执行分配具有随机性。
对象及变量的并发访问
可重入锁:自己可以再次获取自己的内部锁,一个线程获取了某个对象的锁,此时该对象锁还未释放,当线程要再次获得该对象锁是可以获取的。(子类可以获得父类的锁)
同步不可以继承,父类加锁时也需要在子类添加synchronized关键字。
synchronized同步语句块:
当两个并发线程访问同一个对象中的synchronized(this)同步代码块时,一段时间只能有一个线程执行,另外一个线程需等待当前线程执行完这个代码块才能开始执行。
静态同步synchronized方法:
1) synchronized加到static静态方法时是给class类上锁,针对的是该class类的所有实例对象。
2) synchronized加到非静态方法时是给对象上锁,针对的是当前的一个对象。
volatile关键字:主要作用是使变量在多个线程间可见,强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。
synchronized与volatile关键字比较:
1)volatile是线程的轻量级实现,只针对变量,性能比synchronized更好;synchronized用途更广,可以修饰变量,方法和代码块;
2)多线程访问volatile不会发生堵塞,而synchronized会出现堵塞;
3)volatile能保证数据的可见性,但不能保证原子性;synchronized在保证原子性的同时可以间接保证可见性,因为它可以将私有内存与公有内存中的数据同步;
4)volatile解决的是变量在多个线程间的可见性;synchronized解决的是多个线程间访问资源的同步性。