synchronized四要素及抽象
面向对象,java的核心思想就是面向对象编程,以贴近人类在现实生活中的思考方式,任何事物我们都会把它抽象成一个对象,一辆车,一个人,对象是我们思考的基石。
我想说的是,我们写汉字的时候,不会在脑海中命令我们的手去写一撇一捺,我们要么把汉字抽象为一个整体,比如“日”,要么抽象为偏旁的组合,比如“明”,一个白天一个晚上,就是明天了。
英语也是如此,就像synchronized,也是由几部分组成,syn+chron+ized。不是有人说过,学习java,最重要的能力就是——抽象能力。
第一:synchronized的应用场景是什么?
第二:synchronized的实现原理是什么?
第三:synchronized的实现方式是什么?
第四:synchronized的易错点是什么?
第一:synchronized的应用场景是什么?
当多个对象(线程)在同一段时间内需要同样的资源的时候,因为资源的有限性和唯一性,需要更新资源的当前情况来约束对象的行为。比如典型的车票出售,银行取钱等等。感觉抽象的不好。
第二:synchronized的实现原理是什么?
当两个并发线程同时访问同一个对象(Object)的同步代码块(synchronized(this))的时候,一个时间内(cpu时间片)只允许其中一个线程得到执行这个同步代码块,另一个线程必须等待当前线程执行玩以后才可以执行那个同步代码块;但是另一个线程可以去执行对象的非同步代码块,注意,该对象的其他未访问的同步代码块也不能再被其他线程访问,以免容易造成死锁。(显然同步代码块设置过多也有弊端)
第三:synchronized的实现方式是什么?
有同步代码块和同步方法两种来完成。同步代码块更为常用,同步方法如果设置的方法一直在运行,比如run(),那么资源一直无法释放。
package com.enjoyor.soa.traffic.server.nmim.thread;
public class TestThread implements Runnable{
public TestThread(){};
private int appleCount = 4;
public void run(){
for (int i = 0; i < 3; i++) {
synchronized (this) {//不设置为同步代码块会出现资源状态异常,比如负数,重复。
if(appleCount>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"is"+appleCount--);
}
}
}
}
public static void main(String[] args) {
TestThread newTh1 = new TestThread();
//TestThread newTh2 = new TestThread();
Thread Th1 = new Thread(newTh1,"向淋吃苹果");
Thread Th2 = new Thread(newTh1,"吴磊吃苹果");
Th1.start();
Th2.start();
}
}
package com.enjoyor.soa.traffic.server.nmim.thread;
public class TestThread implements Runnable{
public TestThread(){};
private int appleCount = 4;
public void run(){
for (int i = 0; i < 3; i++) {
eat();
}
}
private synchronized void eat(){
if(appleCount>0){
try {
Thread.sleep(1000);//休眠的时间设定很有意思
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"is"+appleCount--);
}
}
public static void main(String[] args) {
TestThread newTh1 = new TestThread();
//TestThread newTh2 = new TestThread();
Thread Th1 = new Thread(newTh1,"向淋吃苹果");
Thread Th2 = new Thread(newTh1,"吴磊吃苹果");
Th1.start();
Th2.start();
}
}
pojo中的set和get方法可能会需要同步。
消费者和生产者问题,加入同步和唤醒操作,通过flag,设置wait()>sleep()>notify().
第四:synchronized的易错点是什么?
暂无,等以后深入接触补充。
synchronized四要素及抽象的更多相关文章
- mysql 事务四要素杂谈
事务四要素 对于数据库来说,并发性和准确性是数据库需要权衡的两个点. 类似于我们的应用系统,又要要性能还要要准确. 数据准确性这一条来说,最好的控制就是串行化,都别急,一个一个来.这样数据就没问题了. ...
- Java基础-四要素之一《抽象》(接口)
抽象的概念就是抽象出共同属性:成员变量和方法 定义抽象使用abstract关键字定义抽象类和方法 抽象类 abstract class 包含抽象方法的类,叫抽象类. 所以抽象类可以有private等多 ...
- ACID 数据库正确执行四要素
ACID:数据库事务正确执行所必须满足的四个基本要素的缩写: 原子性(atomicity,或叫不可分割性),一致性(consistency),隔离性(isolation,又称独立性),持久性(dura ...
- Java基础-四要素之一《封装》
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保 ...
- Java基础-四要素之一《继承》
继承的概念: 继承在本职上是特殊——一般的关系,即常说的is-a关系.子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 继承是所有OOP语言不可缺少的部分,在java中使 ...
- synchronized(四)
package com.bjsxt.base.sync005;/** * synchronized的重入 * @author alienware * */public class SyncDubbo1 ...
- 设计模式(四)——Java抽象工厂模式
抽象工厂模式 1 基本介绍 1) 抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类 2) 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合. 3) ...
- Java基础-四要素之一《多态》
什么是多态 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的 ...
- UI设计四要素
信息.样式.布局.交互. +层次: UI所有的工作都可以从这几个方面入手.
随机推荐
- 关于如何通过定义自己的CameraManager来控制视角
2016.8.30 发现了这个函数,可以直接获得摄像机的位置和旋转. Controller->GetPlayerViewPoint(CamLoc, CamRot); 最近看了几天PlayerCa ...
- div可编辑状态设置
<div contentedittable="ture"></div>
- 制作IOS企业版App网页扫描二维码下载安装
有时候我们需要在XX网站的主页上去扫描二维码下载,那么ios开发中如何做到这一点呢. 我给大家解答一下,这也是在最近工作中用到的部分,在网上了解了一些. 下面给大家分解一下步骤: 1.Plist 和 ...
- 【PostgreSQL】PostGreSQL数据库,时间数据类型
---"17:10:13.236"time without time zone:时:分:秒.毫秒 ---"17:10:13.236+08"time with t ...
- MySQL查询语句(select)详解(2)
7.子查询 当进行查询的时候,需要的条件是另外一个select语句的结果,这时候就要用到子查询 用于子查询的主要关键字有:in,not in,=,!=,exists,not exists等. 以下两张 ...
- HTML 5 画布(canvas)
canvas 元素使用 JavaScript 在网页上绘制图像,本身是没有绘图能力. canvas 是一个矩形区域,可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以及添加图像的 ...
- Intellij如何设置编译后自动重新加载class文件?
前段时间突然发现Intellij不能自动重新加载类了,每次编译后都要重新启动项目,才能显示更新效果,后来网上查询Intellij下如何配置热部署,都说是要配置构件,然后在web容器的编辑页面选择upd ...
- Moneybookers API支付方式开发 步骤
开发文档: 支付说明手册 步骤: 1.使用商家帐号,登录到www.moneybookers.com,核对商家信息是否正确. 2.在账户-->商家工具(设置) a.API/MQI password ...
- Unity3D的四种坐标系
[Unity3D的四种坐标系] 1.World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. ...
- CSS3的高级特性
CSS3对响应式设计非常有用:使用CSS3替代图片,在有带宽限制的网页中可有效减少http请求(从而使网页加载更快),并可使网页更灵活.更容易维护. 在开发CSS3时,要记住添加相关的浏览器私有前缀以 ...