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并发知识总结的更多相关文章

  1. Java并发知识整理

    整理了一下前段时间学习Java并发的笔记,大约有40篇. 1. Java并发基础知识 并发基础(一) 线程介绍 并发基础(二) Thread类的API总结 并发基础(三) java线程优先级 并发基础 ...

  2. Java并发知识总结,超详细!

    首先给大家分享一个github仓库,上面放了200多本经典的计算机书籍,包括C语言.C++.Java.Python.前端.数据库.操作系统.计算机网络.数据结构和算法.机器学习.编程人生等,可以sta ...

  3. Java并发知识(1)

    1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和 ...

  4. Java并发知识(2)

    1. 什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)? 原子操作是指一个不受其他操作影响的操作任务单元.原子操作是在多线程环境下避免数据不一致 ...

  5. Java并发知识分享

    volatile的内存语义 从JSR-133(即从JDK1.5开始),volatile变量的写-读可以实现线程之间的通信 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷 ...

  6. Java并发知识概述

    1.Java内存模型的抽象结构 Java中,所有的实例.静态域和数组元素都存储在堆内存中,堆内存是线程共享的.局部变量,形参,异常处理参数不会在线程之间共享,所以不存在内存可见性问题,也就不受内存模型 ...

  7. (一)java并发知识图谱

  8. java完整并发知识结构图

    一张大的java并发知识结构图,梳理清楚知识的脉络,知识不再零散

  9. Java并发编程有多难?这几个核心技术你掌握了吗?

    本文主要内容索引 1.Java线程 2.线程模型 3.Java线程池 4.Future(各种Future) 5.Fork/Join框架 6.volatile 7.CAS(原子操作) 8.AQS(并发同 ...

随机推荐

  1. python-第三方包的安装和升级和卸载

    安装源: 豆瓣   http://pypi.douban.com/simple/ 本地安装: egg文件:  使用settools自带的安装脚本easy_install进行安装 whl文件:      ...

  2. git的初步研究1

    工作中很多项目再往git上迁移,所以打算研究下git git是个版本控制系统 理解git工作区.暂存区.版本库的概念 工作区:在电脑中能看到的目录 暂存区:index即索引 即首先add加入暂存区 c ...

  3. 微信小程序-坑1-await-async

    VM45:1 thirdScriptError sdk uncaught third Error regeneratorRuntime is not defined ReferenceError: r ...

  4. Shell-04

    grep程序 Linux下文本处理三剑客-----grep sed awk sed:文本行编辑器(流编辑器)        awk:报告生成器(文本输出格式化)         grep:文本行过滤工 ...

  5. linux入门 一些常见命令

    chvt 切换终端 用法 1是终端 7是图形界面 sudo chvt 1 or 7 cp 复制文件/目录 -a : 通常在复制目录时使用,保存链接,文件属性并递归复制目录 -f:若文件在目标路径中则强 ...

  6. 设计模式学习笔记——Adapter 适配器模式

    适配器设计模式的适应场景: 一般情况是上端固定,下端固定,下端功能不满足或跟上端不协调,使用适配器重新包一层(继承适配器接口,以满足上端需求,继承下层类,以调用方法),使下端代码能满足上端需求(欺骗, ...

  7. #1113-JSP 语法

    JSP 语法 JSP开发中的基础语法. 脚本程序 脚本程序可以包含任意量的Java语句.变量.方法或表达式,只要它们在脚本语言中是有效的. 脚本程序的语法格式: <% 代码片段 %> 或者 ...

  8. Ecipse代码调试

    1.设置断点 2.启动调试 在代码空白处中右击,选择Debug as —>1 Java Application 快捷键 表示当前实现继续运行直到下一个断点,快捷键为F8. 表示打断整个进程 表示 ...

  9. 前端进阶系列(二):css常见布局解决方案

    水平居中布局 margin+定宽 <div class="parent"> <div class="child">Demo</di ...

  10. Java 静态static 关键字作用

    静态的方法1.可以通过类名打点访问2.不能使用this关键字3.不能访问非静态的属性和方法 /* * 静态的方法: * 1.属于类的方法,可以通过类名打点访问 * 2.方法中不能使用this关键字 * ...