Java内存模型 在前面谈到了一些关于内存模型以及并发编程中可能会出现的一些问题。下面我们来看一下Java内存模型,研究一下Java内存模型为我们提供了哪些保证以及在java中提供了哪些方法和机制来让我们在进行多线程编程时能够保证程序执行的正确性。 在Java虚拟机规范中试图定义一种Java内存模型 ...
分类:
编程语言 时间:
2018-01-13 14:15:00
阅读次数:
194
多线程程序常考虑三种性质:原子性、可见性、有序性。 1. 原子性: 一个或多个操作的执行,只有两种情况:(1)全部执行并且执行过程中不会被打断;(2)不执行 2. 可见性: 当多个线程访问同一个共享变量时,一个线程修改了变量的值,其他线程能够立即看到被修改的新值。 例如: //线程1执行的代码 in ...
分类:
其他好文 时间:
2018-01-09 21:14:34
阅读次数:
128
前言:常见的数据结构都有指针和数组两种实现方式,这篇先介绍指针实现,而数组实现在后续文章里会讲到。 (长文预警!) 说完了一般的树,我们再来看看二叉树,这是一种很典型的树,它的所有节点度数都不超过2,最多只有两个孩子。这是一种特例,但是后面我们会看到在保证有序性和有根性之后,它却足以描述所有的树。每 ...
分类:
其他好文 时间:
2017-12-02 19:46:27
阅读次数:
135
TreeSet是SortedSet接口实现的类. TreeSet保证了遍历时的有序性.TreeSet就是红黑树. 添加时,从根结点开始比较,确定插入左子树还是右子树,这是个比较的过程. 所以 (1) 添加的对象必须自身继承Comparable接口,实现compareTo(Object obj),比如 ...
分类:
其他好文 时间:
2017-11-25 23:36:18
阅读次数:
235
收获颇丰的两天··· 题目1:序列操作 给定n个非负整数,进行m次操作,每次操作给出c,要求找出c个正整数数并将它们减去1,问最多能进行多少操作?n,m<=1000000 首先暴力贪心肯定是每次减去数中前c大的数·· 因此我们考虑每次减去前c大的数后依然保持数列的有序性,假设数列为111223,c= ...
分类:
其他好文 时间:
2017-11-08 12:01:20
阅读次数:
166
volatile:易变的,是说这变量可能会被意想不到地改变。 1.可见性 对于可见性,Java提供了volatile关键字来保证可见性。 当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。 而普通的共享变量不能保证可见性,因为普 ...
分类:
其他好文 时间:
2017-10-31 14:29:11
阅读次数:
166
一、线程三大特性 多线程有三大特性,原子性、可见性、有序性 1.1 什么是原子性 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上 ...
分类:
编程语言 时间:
2017-10-08 13:37:52
阅读次数:
285
习题2.4 递增的整数序列链表的插入(15 分) 本题要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。 函数接口定义: List Insert( List L, ElementType X ); 其中List结构定义如下: typedef struct No ...
分类:
其他好文 时间:
2017-09-12 23:17:07
阅读次数:
2281
一、Java中的volatile在Java程序中,如果一个变量被volatile关键字修饰,那么这个变量就具有了有序性和可见性。有序性:java语言中提供了synchronized和volatile两个关键字保证线程之间操作的有序性,也就是他可以使CPU指令有序。可见性:当一个线程操作一个被volatile修饰的变..
分类:
其他好文 时间:
2017-09-11 18:22:41
阅读次数:
96
多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现。 在多个线程之间共享类的一个对象,这个对象是被创建在主内存(堆内存)中,每个线程都有自己的工作内存(线程栈),工作内存存储了主内存对象的一个副本,当线程操作对象时,首先从主内存复制对象到工作内存中,然后执行代码改变了值,最后 ...
分类:
编程语言 时间:
2017-09-02 18:04:44
阅读次数:
112