文档章节

架构师课程1-多线程基础

业余编程人士
 业余编程人士
发布于 2017/07/07 13:49
字数 990
阅读 38
收藏 0

Static Synchronised 是类级别的锁,独占的 绝对同步, 可以跨多对象同步。

Synchronised 是对象锁,对每一个对象加锁 。

Synchronised 的方法或快是相对安全 一般用于set value时用,而不是get value

Oracle: undo 作用是当客户端DML操作时,oracle 是把旧值放入undo表空间,如果操作中途失败,去undo 找出来 回滚回去用的。因此 oracle 是consistent read 的,客户端9点找数据,就查9点时候的数据。如果中途有人DML操作,则一致性读特性就提示用户数据变了 报一个错 snapshot too old exception;

Synchronised 方法可以循环嵌套

Synchronised 内部有异常的话 锁自动释放

Synchronised 块 可以锁 类 和 变量 ,synchronised (this) or synchronised (new Object (“”))

Volatile :变量在各个线程中可见,每个线程都可以修改volatile 变量,但不具备原子性

AtomicInteger:支持多线程可见并发的原子操作,集成了volatile 适合多线程+ - 步长

Wait/notify: 线程之间的通信,必须配合synchronised 使用,wait 释放锁 notify 不释放锁。

两个线程互相通信可以写成死循环的形式互相监控 但是这样实现很不好,改进

Final Object lock = new Object();
Thread t1 = new Thread(new Runnable(){
   syncronised(lock) {
     if (list.size() == 5) {
       // 发出通知 唤醒另外一边的线程 ,另一边一定是在wait,并没有释放lock锁,所以不会立刻通知,运行完才释放
       lock.notify(); 
     }
   }
},"t1");

Thread t2 = new Thread(new Runnable(){
   syncronised(lock) {
     if (list.size() != 5) {
       lock.wait(); // 等待被唤醒
     }
     logger.debug("还没有被唤醒");
   }
},"t2");

// 注:t2必须先执行,先开始等待 再t1进行通知才可以!

实现实时的通知唤醒效果

Final CountDownLatch countDownLatch = new CountDownLatch (1);
Thread t1 = new Thread(new Runnable(){
     if (list.size() == 5) {
       countDownLatch.countDown(); //发通知
     }
},"t1");

Thread t2 = new Thread(new Runnable(){
     if (list.size() != 5) {
       countDownLatch.await(); // 等待被唤醒
     }
     logger.debug("还没有被唤醒");
},"t2");

LinkedBlockingQueue : 就是用wait 和 notify + linkedlist 制作的

单利模式支持多线程:static inner class模式 + holder 模式, 如果是单利,hashcode()一定一样

public class Sing {
  private static class InnerSign {
     private static InnerSign holder = new InnerSing();
  }

  public static Sing getInstance() {
     return InnerSign.holder; // lazy loading
  }
}

让集合线程安全: Collections.syncronisedMap(new HashMap<String,String>())

并发类容器

-ConcurrentMap容器实现是用减少锁力度的方法,分成多个小的hashtable()叫做segment然后对每一个segment加锁

ConcurrentHashMap() // 无序的 ConcurrentSkipListMap() //有序的

-CopyOnWrite容器,当对一个元素执行写操作时,不对当前容器操作,先copy一个副本,对新的操作,然后指引用到旧的容器,这样就可以并发读操作,实现了读写分离 读多写少下使用多

CopyOnWriteArrayList()   CopyOnWriteArraySet()

ConcurrentLinkedQueue() //先进先出,非阻塞,不可以为null

ArrayBlockingQueue // 有界的,一般并发访问很大的时候用 对超过界限时候做一个处理策略

LinkedBlockingQueue // 无界的,性能比较好,在数据来的不大时候可以选用

SynchronousQueue(); // 没有缓冲队列 生产了会直接被消费,不直接add元素,必须先take才能add

PriorityBlockingQueue() // 里面元素<Item>必须实现Comparable接口 ,一个有优先级的队列

DelayQueue() // 带有延迟时间的队列,设一个延迟时间 当时间到了元素自动出来,多用于任务超时处理,里面东东必须实现Delayed借口。

-----------------------------------------------------------------------------------------------------

Future模式:请求后直接返回一个假对象,后台慢慢加载真实数据,加载完了再返回。异步加载

Master-worker 模式:Master主要负责接收和分配任务 Worker负责处理任务,好处是讲大任务分解成小任务,并行计算。手写strorm。

实现代码可以参考:

	private ConcurrentLinkedQueue<Task> workQueue = new ConcurrentLinkedQueue<>();
	private HashMap<String, Thread> workers = new HashMap<>();
	private ConcurrentHashMap<String, Object> result = new ConcurrentHashMap<>();

 

Message Queue : 本质就是有消息堆积能力的容器 RocketMQ.来缓解消费端压力。不能实现实时。如果要实时,建议使用TCP直连,例如mina 或者 netty.

© 著作权归作者所有

下一篇: Java 的锁
业余编程人士
粉丝 5
博文 19
码字总数 9137
作品 0
其他
程序员
私信 提问
分享一套Netty&ZeroMQ视频实战教程

该视频教程来源于微信群友分享,现在免费分享给大家,希望对你们有用。 视频教程目录结构如下: │ ├─1、课程介绍 │ │ 1-1 课程介绍.avi │ │ 1-2 初始设计.avi │ │ 1-课程介绍.pdf ...

架构之路
2018/01/04
0
0
我们在谈高并发、分布式,其实都在谈什么?

2018年,互联网行业风起云涌,IT工程师如果仅凭传统开发思维,无法突破固有知识体系,终将会被社会所淘汰。既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的领导型人物—...

技术琐话
2018/06/20
0
0
面试:Semaphore(信号量)的成长之路

2019最寒冷,面试跳槽不能等 马上就3月份了,所谓的金三银四招聘季。2019年也许是互联网最冷清的一年,很多知名的大型互联网公司都裁员过冬。当然也有一些公司还在持续招人的,比如阿里就宣称...

尹吉欢
02/25
0
0
开源SNS社区软件近乎(Spacebuilder)二次开发培训课开始招生

学习是每一个人 绝对不应该放弃的能力。 为什么需要这样的课程? 本次培训课适用人群: 具有一定C#开发和架构使用基础、熟悉MVC架构的学员,想通过本次课程的学习,定制和开发社区项目的学员...

近乎SNS
2015/11/03
161
0
没吃透 Netty 底层通讯原理,还能算的上 Java 老司机?

搞了N年Java,仍有不少朋友困惑:用了很多年Dubbo,觉得自己挺厉害,跳槽面试时一问RPC,一问底层通讯,一问NIO和AIO,就一脸懵逼,到底该怎么办? 画外音:大家有没有这样的感触?Dubbo用得...

ImportNew
01/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
41
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部