Java并发知识总结
jixu
8. 并发
启动线程的几种方式
Thread t7 = new Thread(timer);
t7.start();
Thread.sleep(100) //暂停当前线程
class MT extends Thread {
private int n;
public MyThread( int n ){
super();
this.n=n;
}
public void run() {
for(int i=0;i<n;i++) {
System.out.println(i);
}
}
}
Class MT implements Runnable{
private int n;
public MyTask(int n){
this.n = n;
}
public void run() {
for(int i=0; i<n; i++) {
System.out.println(i);
}
}
}
new Thread(){
public void run() {
for(int i=0; i<10; i++)
System.out.println(i);
}
}.start();
new Thread( ( ) -> {
for(int i=0; i<10; i++)
System.out.println(i);
} ).start();
线程同步
- synchronize:对象加锁
synchronized(cnt) {
cnt++; //临界区
}- wait() 释放对象锁,阻塞当前进程
- notify() / notifyAll() 相当于signal,让阻塞的线程继续
java并发API:java.util.concurrent
原子变量:保证线程安全
AtomicInteger cnt=new AtomicInteger(0);
cnt.getAndIncrement();
集合:
ArrayList/HashMap不是线程安全的
Vector及Hashtable是线程安全的
CopyOnWriteArrayList、 CopyOnWriteArraySet:适合于很少写入而读取频繁的对象
ConcurrentHashMap:putIfAbsent(), remove(), replace()
队列:
BlockingQueue<Integer> q=new ArrayBlockingQueue<>(3); put() take()
线程池
class ThreadPoolDemo
{
public static void main(String[] args) {
ExecutorService pool=Executors.newCachedThreadPool();
MyTask t1=new MyTask(5); MyTask t2=new MyTask(7);
pool.execute(t1); pool.execute(t2);
pool.shutdown();
}
}
class MyTask implements Runnable {
int n=10;
public MyTask(int n){ this.n=n;}
public void run(){
for(int i=0;i<n; i++)System.out.print(i);
}
}
实现一个生产者-消费者问题
class Producer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
for (int i = 0; i <10; i++)
cubbyhole.put(i);
}
}
class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
int value = 0;
for (int i = 0; i <10; i++)
value = cubbyhole.get();
}
}
class CubbyHole {
private int data[] = new int[3];
private int index = 0;
public synchronized int get() {
while (index <= 0) {
try{
wait(); //waits for notify() from Producer
} catch (InterruptedException e) { }
}
index --;
int value = data[index];
System.out.println("Consumer got: " + data[index]);
notify();
return value;
}
public synchronized void put(int value) {
while (index >= data.length) {
try{
wait(); //waits for notify() from consumer
} catch (InterruptedException e) { }
}
System.out.println("Producer put: " + value);
data[index] = value;
index ++;
notify();
}
}
class ProducerConsumerStack {
public static void main(String args[]) {
CubbyHole c = new CubbyHole();
Producer p1=new Producer(c,1);
Consumer c1=new Consumer(c,1);
p1.start();
c1.start();
}
}
Ref:https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%B9%B6%E5%8F%91.md
Java并发知识总结的更多相关文章
- Java并发知识整理
整理了一下前段时间学习Java并发的笔记,大约有40篇. 1. Java并发基础知识 并发基础(一) 线程介绍 并发基础(二) Thread类的API总结 并发基础(三) java线程优先级 并发基础 ...
- Java并发知识总结,超详细!
首先给大家分享一个github仓库,上面放了200多本经典的计算机书籍,包括C语言.C++.Java.Python.前端.数据库.操作系统.计算机网络.数据结构和算法.机器学习.编程人生等,可以sta ...
- Java并发知识(1)
1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...
- Java并发知识(2)
1. 什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)? 原子操作是指一个不受其他操作影响的操作任务单元.原子操作是在多线程环境下避免数据不一致 ...
- Java并发知识分享
volatile的内存语义 从JSR-133(即从JDK1.5开始),volatile变量的写-读可以实现线程之间的通信 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷 ...
- Java并发知识概述
1.Java内存模型的抽象结构 Java中,所有的实例.静态域和数组元素都存储在堆内存中,堆内存是线程共享的.局部变量,形参,异常处理参数不会在线程之间共享,所以不存在内存可见性问题,也就不受内存模型 ...
- (一)java并发知识图谱
- java完整并发知识结构图
一张大的java并发知识结构图,梳理清楚知识的脉络,知识不再零散
- Java并发编程有多难?这几个核心技术你掌握了吗?
本文主要内容索引 1.Java线程 2.线程模型 3.Java线程池 4.Future(各种Future) 5.Fork/Join框架 6.volatile 7.CAS(原子操作) 8.AQS(并发同 ...
随机推荐
- 【leetcode】1146. Snapshot Array
题目如下: Implement a SnapshotArray that supports the following interface: SnapshotArray(int length) ini ...
- lua脚本入门
在网上下载一些工程,里边常常存在.lua .sh .in .cmake .bat等文件 今天专门查了一下相关文件的作用 .sh 通常是linux.unix系统下的脚本文件(文本文件),用于调用默认的s ...
- CSS盒子模型(框模型)
一.如何理解盒子模型 盒子模型(框模型)是css部分非常重要的一部分知识,CSS在处理网页的时候,认为每个元素都处在一个不可见的盒子中.盒子模型的构想,把所有的元素都想象成盒子,那么对网页进行布局 ...
- Warning: Failed prop type: Invalid prop `value` supplied to `Picker`.报错问题
在使用antd的日期插件时,不留意就会报各种错误. 例如:Warning: Failed prop type: Invalid prop `value` supplied to `Picker`. 这 ...
- php array_pop()函数 语法
php array_pop()函数 语法 作用:删除数组中的最后一个元素.博智达 语法:array_pop(array) 参数: 参数 描述 array 必需.规定数组. 说明:返回数组的最后 ...
- 转:HTML5 History API 详解
从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...
- redis过期策略设置
中6中过期策略的具体方式. redis 中的默认的过期策略是volatile-lru .设置方式 可以通过命令直接设置 config set maxmemory-policy volatile-lru ...
- 用二叉树进行排序 x (从小到大)
先输入n,表示拥有多少个数: 第二行输入1-n个数,然后开始排序 输出从小到大的排序. ----------------------------------------------代码~------- ...
- [LightOJ1240]Point Segment Distance 题解
题意简述 原题LightOJ 1240,Point Segment Distance(3D). 求三维空间里线段AB与C. 题解 我们设一个点在线段AB上移动,然后发现这个点与原来的C点的距离呈一个单 ...
- Codeforces Round #350(Div 2)
因为当天的下午才看到所以没来得及请假所以这一场没有打...于是信息课就打了这场的模拟赛. A题: *题目描述: 火星上的一年有n天,问每年最少和最多有多少休息日(周六周天). *题解: 模7分类讨论一 ...