《Java多线程编程核心技术》——多线程与同步
Java多线程
线程可以理解为是在进程中独立运行的子任务。
Java多线程
使用方法
Java中实现多线程主要有以下两种方法:
- 继承Thread,而后实例化该对象调用start()即启动了新线程;
- 实现Runnable,通过
new Thread(Runnable run)
实例化该线程,而后调用start();
常用方法
Thread.currentThread()
静态方法,获取当前线程对象;isAlive()
判断线程是否处于活动状态,即线程已启动且尚未终止;Thread.sleep(long )
在指定的毫秒数内让当前线程休眠,需要catch InterruptedException
;Thread.interrupted()
判断该线程是否中断,执行后将清除中断标志;isInterrupted()
测试线程是否已经中断;suspend() resume() stop()
暂停、开始和结束线程,不应该使用。暂停方法不会释放资源;yield()
该线程放弃当前CPU资源,放弃后马上进行CPU竞争;setPriority()
设置线程优先级,1~10,越大优先级越高;- 优先级具有继承性,即子线程有父线程的优先级;
- 高优先级的线程总是大部分先执行完,但不代表高优先级将全部先完成;
- 优先级较高的不一定每一次都先执行完,具有随机性;
- 具体的与OS相关;
setDaemon()
设置守护线程,当进程不存在非守护线程时则守护线程将销魂而后进程销毁;
停止线程
停止线程有一下方法:
- 使用退出标志,在线程中检查标志判断是否退出。
- 使用stop方法强制终止线程,该方法可能导致线程不安全,不要使用。
- 使用interrupt方法中断线程,其原理就是第1条,只是Thread对其进行了封装。
- 使用interrupt中断结合异常退出线程,在线程中当读到中断标志已经设置,可在此时抛出
InterruptedException
使线程退出。 - 在sleep状态下如果该线程被中断,则将进入
catch InterruptedException
同时将清除中断标志。 - 使用interrupte与return实现停止线程,但是仍然建议使用异常退出,这样可以保留中断异常使线程停止异常得到传播。
同步
非线程安全:存在多个线程对同一个对象中的实例变量进行并发访问控制由此导致的数据脏读;
- 方法内的局部变量和实例内的私有变量(不存在get/set)均不能被外部访问,因此是线程安全的;
synchronized
- synchronized取得的是对象锁而非方法或代码块的锁;
- synchronized声明的方法一定是排队运行的,而且只有共享资源的读写才需要使用其进行同步;
- synchronized声明的非静态方法其获取的锁是该实例对象的锁;
- synchronized声明的静态方法获取的锁是该类对象(永久代中类对象)的锁;
- synchronized声明的代码块获取的锁则是括号里声明的对象的锁;
- synchronized未声明的方法对其调用时不需要考虑锁的问题,因此不会有synchronized方法或代码块冲突;
- synchronized支持锁重入(同一线程多次获取同一个锁);
- 同步方法或代码块中出现异常则其所持锁将自动释放;
- 方法的同步不具有继承性;
- 同步方法或代码块是否冲突只看两者锁持有的锁是否是同一个;
- synchronized声明的非静态方法与synchronized(this)的代码块使用的锁都是对象本身;
- 由于String的常量池可能使相同字符串指向同一个对象,因此不要使用String作为synchronized代码块的对象监视器;
- synchronized方法或代码块内的变量也有可见性;
volatile
- volatile是使变量拥有可见性;
- volatile修饰的变量在使用时并非从工作内存获取而是都从主内存中获取;
- volatile修饰的变量在修改时其修改结果将直接写入到主内存;
- 多线程访问volatile变量不会阻塞,但是不保证变量的原子性;
---恢复内容结束---
《Java多线程编程核心技术》——多线程与同步的更多相关文章
- Java多线程编程核心技术---多线程技能
1.继承Thread /** * Copyright (C), 2018-2018, * FileName: MyThread * Author: 大象 * Date: 2018-06-08 22:3 ...
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- Java多线程编程核心技术---对象及变量的并发访问(二)
数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...
- Java多线程编程核心技术
Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...
- 《Java 多线程编程核心技术》- 笔记
作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...
- Java多线程编程核心技术(三)多线程通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- Java多线程编程核心技术(二)对象及变量的并发访问
本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...
- Java多线程编程核心技术(一)Java多线程技能
1.进程和线程 一个程序就是一个进程,而一个程序中的多个任务则被称为线程. 进程是表示资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位. 举个例子: 打开你的计算机上的任务管 ...
- java多线程编程核心技术学习-1
实现多线程的两种方式 继承Thread类,重写Thread类中的run方法 public class MyThread extends Thread{ @Override public void ru ...
- 《java多线程编程核心技术》不使用等待通知机制 实现线程间通信的 疑问分析
不使用等待通知机制 实现线程间通信的 疑问分析 2018年04月03日 17:15:08 ayf 阅读数:33 编辑 <java多线程编程核心技术>一书第三章开头,有如下案例: ...
随机推荐
- Sprinig泛型依赖注入
在父类中建立关系 (spring4.x以上版本) package com.spring.annotation.generic; import org.springframework.beans.fac ...
- linux程序员的proc文件系统
1) 设置core文件存放路径和文件名模式: 设置/proc/sys/kernel/core_pattern,如: echo "core" > /proc/sys/kerne ...
- XXX is not mapped
这个问题绊了我两次跟头,作为一个3年多开发经验的人,甚是尴尬 java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntax ...
- android sqlite 数据唯一性
sqlite在遇到数据重复的时候要做判断在插入是不是有点太麻烦了?一个好的数据库设计就可以搞定了. 当要控制唯一性的数据是主键的时候可以设置 CONSTRAINT [] PRIMARY KEY ([Q ...
- 冲刺博客NO.5
今天做了什么:布局UI和效果图,学会了监听事件并销毁监听接口 SMSSDK.unregisterAllEventHandler(); 今天做的东西不多,没有遇到什么苦难
- 7.css浮动与定位
外边距塌陷 解决方案: ◆给父盒子加border ◆overflow:hidden; bfc 行内元素可以定义左右的内外边距,上下会被忽略掉. 行内块可以定义内外边距. 文档流(标准流) 元素自上而下 ...
- phpStudy模式下安装ssl证书,详细版
phpStudy模式下安装ssl证书,详细版 2017年12月16日 14:27:38 骑着蚂蚁追大象 阅读数:4232 标签: phpstudy安装ssl证书 更多 个人分类: php 版权声明 ...
- 关于getProperties的一点记录
写了一很简单的获取配置文件的代码,结果怎么都在报空指针,经过上网查,直到要这样写才不会报: InputStream is = getClass().getClassLoader().getResour ...
- [转载]持续交付和DevOps的前世今生
作者/分享人:乔梁,20年IT老兵,腾讯公司高级管理顾问,敏捷和精益开发专家,持续交付领域先行者.曾就职于百度,国内多个知名互联网公司的企业教练. 历年QCon技术大会的讲师和专题出品人. 这是一个新 ...
- asp.net core mvc 中间件之WebpackDevMiddleware
asp.net core mvc 中间件之WebpackDevMiddleware WebpackDevMiddleware中间件主要用于开发SPA应用,启用Webpack,增强网页开发体验.好吧,你 ...