面向对象,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四要素及抽象的更多相关文章

  1. mysql 事务四要素杂谈

    事务四要素 对于数据库来说,并发性和准确性是数据库需要权衡的两个点. 类似于我们的应用系统,又要要性能还要要准确. 数据准确性这一条来说,最好的控制就是串行化,都别急,一个一个来.这样数据就没问题了. ...

  2. Java基础-四要素之一《抽象》(接口)

    抽象的概念就是抽象出共同属性:成员变量和方法 定义抽象使用abstract关键字定义抽象类和方法 抽象类 abstract class 包含抽象方法的类,叫抽象类. 所以抽象类可以有private等多 ...

  3. ACID 数据库正确执行四要素

    ACID:数据库事务正确执行所必须满足的四个基本要素的缩写: 原子性(atomicity,或叫不可分割性),一致性(consistency),隔离性(isolation,又称独立性),持久性(dura ...

  4. Java基础-四要素之一《封装》

    封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保 ...

  5. Java基础-四要素之一《继承》

    继承的概念: 继承在本职上是特殊——一般的关系,即常说的is-a关系.子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 继承是所有OOP语言不可缺少的部分,在java中使 ...

  6. synchronized(四)

    package com.bjsxt.base.sync005;/** * synchronized的重入 * @author alienware * */public class SyncDubbo1 ...

  7. 设计模式(四)——Java抽象工厂模式

    抽象工厂模式 1 基本介绍 1) 抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类 2) 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合. 3) ...

  8. Java基础-四要素之一《多态》

    什么是多态 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的 ...

  9. UI设计四要素

    信息.样式.布局.交互. +层次: UI所有的工作都可以从这几个方面入手.

随机推荐

  1. 我的c++学习(9)指针

    ◆ 1.指针变量的赋值.初始化与简单应用 ,y; y=; // y可以理解成该存储单元的当前名字 int *ip; // ip是一个指针(变量) ip=&y; // ip是存储空间y的地址 c ...

  2. dedecms为什么文档标题最大长度只能显示二十个汉字呢?

    今天遇到文章标题无论怎么修改,超出二十个汉字不能全部保存,系统只截取前二十个汉字的内容进行保存. 在后台查看系统设置: 系统——其它选项——文档标题最大长度,的值是60,对应的数据库表字段char的长 ...

  3. Linux Kernel Oops异常分析

    1.PowerPC小系统内核异常分析 1.1  异常打印 Unable to handle kernel paging request for data at address 0x36fef31eFa ...

  4. cocos2d-x初步了解

    1.渲染 2.帧率(FPS) 超过75一般就不容易察觉到有明显的流畅度提升 >50 非常好! 30~40  一般, 20~30  及格,有点勉强. 3.渲染驱动游戏 事件驱动游戏 4.cocos ...

  5. 随鼠标轮动翻动层————jquery小练习

    闲来无事在网站上看见一个网页制作的不错,就仿照做来看看.特此记录下来. 亮点:随鼠标上下滚动,展示页面随之不同,翻动效果. 功能点:鼠标向上,向下判断事件. css 代码 html { overflo ...

  6. odoo 人力资源工资计算拓展

    默认情况下 odoo工资条的计算只支持一下几种python变量: # payslip: object containing the payslips# employee: hr.employee ob ...

  7. 13.final关键字

    1.final修饰的变量只能赋一次值,不赋值时,会提示初始化 2.final修饰的方法不能被重写 3.final修饰的类不能被继承

  8. ArcGIS JavaScript + 天地图API之显示混乱

     异常描述: (1)ArcGIS JavaScript 调用天地图WMTS服务,出现了这种混乱的效果,加载不完整. (2)昨天是相关瓦片的请求,Google浏览器显示的是请求失败.当时怀疑是无线网络的 ...

  9. 榮耀6 Plus將是一部沒有對手的手機

    華為榮耀官方微博發佈消息正式確定了年度旗艦新品將命名為榮耀6 Plus,據稱,該機將是“2014年度最最旗艦手機”,並將集“科學與美學一身”.“探索幾何與視覺極限”,同時,官方微博還不低調地宣稱該機將 ...

  10. 【转】logback logback.xml常用配置详解(一)<configuration> and <logger>

    原创文章,转载请指明出处:http://aub.iteye.com/blog/1101260, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...