Java并发(4)- synchronized与CAS】的更多相关文章

在多线程程序中,同步修饰符用来控制对临界区代码的访问.其中一种方式是用synchronized关键字来保证代码的线程安全性.在Java中,synchronized修饰的代码块或方法不会被多个线程并发访问.它强制要求线程在进入一个方法之前获得一个锁,在离开方法时释放该锁.它保证了在同一时刻只有一个线程能执行被其修饰的方法. 如果我们把一个方法或代码块定义为同步的,就意味着在同一个对象中,只会有一个对同步方法的调用.如果在一个线程内部调用了一个同步方法,则其他线程会一直阻塞,直到第一个线程完成方法调…
记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药.但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它. 诚然,随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得那么重了.下面…
在计算机操作系统中,并发在宏观上是指在同一时间段内,同时有多道程序在运行. 一个程序可以对应一个进程或多个进程,进程有独立的存储空间.一个进程包含一个或多个线程.线程堆空间是共享的,栈空间是私有的.同样,在一个进程中,宏观上有多个线程同时运行.(微观上在单cup系统中,同一时刻,只有一个程序在运行.) 基于以上原理,线程在并发运行时,对共享数据的操作存在数据同步问题. 1.基本概念 1.什么样的数据会被存储在线程共享空间堆里? 对象,当使用new 关键字创建一个对象时,这个对象就被存储在堆里.…
以下内容转自http://ifeve.com/compare-and-swap/: CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值.这听起来可能有一点复杂但是实际上你理解之后发现很简单,接下来,让我们跟深入的了解一下这项技术. CAS的使用场景 在程序和算法中一个经常出现的模式就是“check and act”模式.先检查后操作模…
多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题.同步机制可以使用synchronized关键字实现.synchronized关键字修饰一个方法的时候,该方法叫做同步方法.synchronized方法执行完或发生异常时,会自动释放锁.synchronized可以用来修饰普通方法(等同于synchronized(this)),静态方法(等同于synchronized(AA.class))以及同步块(synchronized(o…
1 AtomicInteger解析 众所周知,在多线程并发的情况下,对于成员变量,可能是线程不安全的: 一个很简单的例子,假设我存在两个线程,让一个整数自增1000次,那么最终的值应该是1000:但是多线程情况下并不能保证原子性:最终的结果极有可能不是1000:看如下的代码: package automic; public class AtomicIntegerTest extends Thread{ private Integer count=0; @Override public void…
synchronized用法 在Java中,最简单粗暴的同步手段就是synchronized关键字,其同步的三种用法: ①.同步实例方法,锁是当前实例对象 ②.同步类方法,锁是当前类对象 ③.同步代码块,锁是括号里面的对象 示例: public class SynchronizedTest { /** * 同步实例方法,锁实例对象 */ public synchronized void test() { } /** * 同步类方法,锁类对象 */ public synchronized stat…
synchronized用在方法上锁住的是什么? 锁住的是当前对象的当前方法,会使得其他线程访问该对象的synchronized方法或者代码块阻塞,但并不会阻塞非synchronized方法. 脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的.注意这里 局部变量是不存在脏读的情况 public class ThreadDomain13 {…
synchronized实现锁的基础:Java中每一个对象都可以作为锁,具体表现为3种形式. (1)普通同步方法,锁是当前实例对象 (2)静态同步方法,锁是当前类的Class对象 (3)同步方法块,锁是Synchronized括号里配置的对象 首先看一下普通同步方法. class Sync{ public synchronized void test(String threadname){ System.out.println(threadname+"开始"); try { Threa…
Java提供了多种机制实现多线程之间有需要同步执行的场景需求.其中最基本的是Synchronized ,实现上使用对象监视器( Monitor ). Java中的每个对象都是与线程可以锁定或解锁的对象监视器( Monitor )关联.在同一时间只有一个线程可以在对象监视器( Monitor )上保持锁定.任何其他线程试图锁定对象监视器( Monitor )都会被阻止,直到它们可以获得该监视器上的锁定. Synchronized 基本使用方式 Synchronized 的作用范围,依据锁定的对象(…