面向对象,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. iOS--NSTimer设置定时器的两种方法

    //方法一: //创建定时器 NSTimer *timer=[NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(next ...

  2. mysql解压版安装

    1.下载MySQL解压版(32位) http://dev.mysql.com/downloads/mysql/

  3. Redis 基本操作

    参考网址:http://doc.redisfans.com/            redis 在操作的时候,不区分大小写(包括php) Key(键) DEL key [key ...] 删除给定的一 ...

  4. jqgrid cellEdit为true的时候,默认选中单元格值的解决方案

    jqgrid cellEdit为true的时候,点击单元格的时候,鼠标在单元格最前面闪. 这时候如果要修改数字内容,非常麻烦.要全选单元格内容,不然不好改. 点击单元格的时候,默认选中单元格值的解决方 ...

  5. 2016huasacm暑假集训训练四 递推_B

    题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/B 题意:给定n个三角形,问最多可以把区域化成多少个部分,这是一个一维空间  一定会 ...

  6. PHP 字符串的隐式转换规则以及针对包含字母的字符串的递增/递减操作

    之前一直对 PHP 中关于字符串的算数运算隐式类型转换规则和递增/递减操作符针对字符串的操作比较模糊,今天总结一下. 一.隐式转换 二进制算术运算符的隐式类型转换规则(http://php.net/m ...

  7. 掌握Thinkphp3.2.0----SQL查询

    首先,先谈一下对查询的理解:查询的对象是数据库中的数据表,一个或多个:查询的限制就是各种条件或要求:查询的结果=表对象+限制(条件). 对数据表的操作(CRUD)查询是最复杂也是最关键的一步!'SEL ...

  8. vmware中两台虚拟机互相访问

    hosts文件   简单说,就是本来访问某个机器是通过其ip,在hosts文件中给ip对应一个名字,那么就可以通过名字来替代ip去访问该机器了(名字显然比ip好记) 环境:宿主机win10系统,安装了 ...

  9. 几何服务,cut功能,输入要素target(修改后)内容。

    几何服务,cut功能测试,输入要素target(修改后)内容. {"displayFieldName":"","fieldAliases": ...

  10. iOS常见算法(二分法 冒泡 选择 快排)

    二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number)  { int start = 0; int end = l ...