java并发编程[持续更新]
java并发编程
1.常用类介绍
Semaphore
Semaphore 类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或逻辑的)线程数目。
Semaphore包含三种操作
初始化
获取acquire()
释放 release()
当信号量大于0的时候semaphore会响应线程请求,释放资源,当信号量等于0时即阻塞线程。
Semaphore有两种模式,公平模式和非公平模式
公平模式遵循FIFO,按照acquire的顺序来分配资源,非公平则为抢占式的。
Semaphore的类图如下,使用内部类Sync继承AbstractQueuedSynchronizer实现
Serializable <|-- Semaphore : implements
Semaphore *-- Sync
AbstractQueuedSynchronizer <|-- Sync
Sync <|-- NonfairSync
Sync <|-- FairSync
class Semaphore{
Semaphore : -Sync sync
Semaphore: +Semaphore(int permits)
Semaphore: +Semaphore(int permits, boolean fair)
Semaphore: +acquire()
Semaphore: +acquire(int permits)
Semaphore: +release()
Semaphore: +release(int permits)
}
class Sync{
...
}
class NonfairSync{
...
}
class FairSync{
...
}
2.名词解释
2.1 线程安全
如果一个进程中有多个线程在同时运行同一段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
2.2 可重入锁和不可重入锁
可重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。意义之一在于防止死锁*。
实现原理:每个锁关联一个请求计数器和占有他的线程,当计数为0时,锁未被占用,当线程请求占用锁时,jvm标记锁的占有者,且将请求计数器置为1。同一线程再次请求锁,计数器递增。每当占用线程退出同步块,计数器递减,知道计数器为0,锁被释放。
*:此处的防止死锁实例
public class demo {
public synchronized void methodA(){
methodB();
}
public synchronized void methodB(){
//todo do something
}
}
当一个线程调用demo类对象的methodA同步方法,如果demo类对象锁未被占有,该线程占有锁,此时调用methodA会触发methodB的调用,此时需要再获取一次锁,只有可重入可以实现。
如下,子类覆写了父类的synchonized方法,然后调用父类中的方法,此时如果没有可重入的锁,那么这段代码将产生死锁
public class Demo {
int i = 10;
public synchronized void parent() {
i--;
System.out.println("parent:" + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class Demo2 extends Demo {
@Override
public synchronized void parent() {
try {
while (i > 1) {
i--;
System.out.println("child:" + i);
Thread.sleep(100);
super.parent();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Demo2 demo2 = new Demo2();
demo2.parent();
}
});
thread.start();
}
}
synchronized和ReentrantLock都是可重入锁
java并发编程[持续更新]的更多相关文章
- java并发编程(更新)
概念理解:①串行程序②并发程序: 线程安全问题: 同一进程中的所有线程共享进程中的内存地址空间.如果没有明确的同步机制来管理共享数据,那么当一个线程正在使用某个变量时,另一个线程可能同时访问这个变量, ...
- 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象
Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...
- Java并发编程75道面试题及答案
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
- Java并发编程(1)-Java内存模型
本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...
- Java并发编程73道面试题及答案 —— 面试稳了
今天主要整理一下 Java 并发编程在面试中的常见问题,希望对需要的读者有用. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任 ...
- 《java并发编程实战》读书笔记2--对象的共享,可见性,安全发布,线程封闭,不变性
这章的主要内容是:如何共享和发布对象,从而使它们能够安全地由多个线程同时访问. 内存的可见性 确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化. 上面的程序中NoVisibility可能 ...
- JAVA并发编程: CAS和AQS
版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/u010862794/article/details/72892300 说起JAVA并发编程,就不得不聊 ...
- Java并发编程系列-(7) Java线程安全
7. 线程安全 7.1 线程安全的定义 如果多线程下使用这个类,不过多线程如何使用和调度这个类,这个类总是表示出正确的行为,这个类就是线程安全的. 类的线程安全表现为: 操作的原子性 内存的可见性 不 ...
- 《Java并发编程的艺术》读书笔记:一、并发编程的目的与挑战
发现自己有很多读书笔记了,但是一直都是自己闷头背,没有输出,突然想起还有博客圆这么个好平台给我留着位置,可不能荒废了. 此文读的书是<Jvava并发编程的艺术>,方腾飞等著,非常经典的一本 ...
随机推荐
- 如何解决jeecgBoot前端运行项目之后无法获取验证码的问题
我也是第一次接触这个开源项目,拿到项目之后,安装完环境和依赖,当我启动项目的时候,验证码却刷新不出来. 然后公司后端告诉我需要改两个接口,一个是public目录下的index.html和vue.con ...
- java 基础 流程控制
鄙人不才,基础不好,趁着闲时简单学习一下,仅作学习分享,如有不正确地方还请各位看客不吝指出. Java流程主要可以分为: 顺序(可以按照正常顺序一步步往下运行的) 选择(三元操作符[?:];if el ...
- 设计模式--Builder生成器模式
如果文章中哪里有问题,希望各位大哥大姐指出,小弟十分感激. 正文 什么是生成器模式? 生成器模式就是把生产对象的过程进一步抽取.细化.独立.以往我们生产对象,可能就是在一个小作坊里面从头做到尾.现在用 ...
- python实现简单的SVM
# -*- coding: utf-8 -*- from sklearn.svm import SVC import numpy as np print(X.shape,Y.shape) X = np ...
- P3879 阅读理解
都这么大了,you这些怎么能算生词呢,难道三年级以前就有人做蓝题了吗(是我不配) 我觉得这道题出难一点点的话,可以整行读入什么的(口嗨怪).先看题目,对于每个生词,输出他出现在了哪些文章(需要排序). ...
- BAT 非右键方式以管理员身份运行批处理
@echo off & PUSHD %~dp0 & TITLE Run The BAT File As An Administrator mode con lines=4 cols=6 ...
- SpringCloud之zuul
- (私人收藏)SQLite 全面手册以及教程
SQLite 全面手册以及教程 https://pan.baidu.com/s/1VKzCWjF79fAiOLjAlx-3zwnfkp SQLite 全面手册以及教程 SQLite 简介 SQLite ...
- HotSpot的类模型(2)
在前一篇文章 HotSpot的二分模型中已经讲过,HotSpot采用了OOP-Klass模型描述Java的类和对象.Klass模型采用Klass类及相关子类来表示具体的Java类,可以理解这些类为Ja ...
- 常用API - 字符串
String类 java.lang.String类代表字符串 Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 特点 字符串的内容不可变!! 因为 St ...