您的位置:首页 > 编程语言 > Java开发

Java多线程 chapter 2 对象及变量的并发访问

2018-03-18 12:30 537 查看

chapter 2 对象及变量的并发访问

2.1synchronized 同步方法

2.1.1方法内的变量为线程安全

“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果就是安全的了。

实例变量[b]*i*[/b],被包装到不同*Thread*中的*MYThread*多次访问,都是同一个*i*变量

2.1.3多个对象多个锁

关键字synchronized取得的锁都是对象锁,而不是把一段代码和函数当做锁;每新建一个对象,就会有一个锁,调用同一对象,才会访问同一把锁。

2.1.4synchronized method

只有共享资源的读写访问才需要同步化,如果不是共享资源,根本没有必要同步。


1)A线程先持有object对象的lock锁,B线程可以以异步的方式调用object对象中的非synchronized方法。 2)A线程先持有object对象的lock锁,B线程此时调用object对象中的其他synchronized方法,也需要等待。也就是同步。

2.1.5脏读

如2.1.4总结1)2)。就是对不同线程对同一对象的异步和同步方法的调用,使得基本环境不一致。读取实例变量时,这个值已经被其他线程更改过了。

2.1.6synchronized锁重入

当一个线程获得对象锁时,再次请求此对象锁是可以再次得到该对象锁的。在一个synchr方法/块内部调用本类其他的synchronized方法/块是可以得到锁的。 在父子类继承关系时,子类完全可以通过“可重入锁”调用父类的同步方法。

2.1.7出现异常,锁自动释放。

2.1.8同步不具有继承性

2.2synchronized 同步语句块

2.2.1synchronized方法的弊端

长时间占用锁

2.2.2同步代码块的使用

同步代码块真的是同步,且持有当前调用对象的锁。


2.2.4一半异步,一半同步。

不在synchronized块中是异步执行,在synchronized块中是同步执行。

2.2.5synchronized代码块之间的同步性。

当一个线程访问object的一个synchronized(this)代码块时,其他线程对同一个对象的其他synchronized(this)代码块的访问将被阻止。这说明synchronized使用的“对象监视器”是一个。

2.2.6

验证同步synchronized(this)代码块时锁当前对象的。

2.2.7将任意对象作为对象监视器。

将任意对象作为对象监视器。


java还支持任意对象作为对象监视器来实现同步功能。


synchro(非this对象x)


1)synchronized(非this) 不与其他锁this同步方法争夺this锁。


2) synchronized(非this) 对象监视器必须是同一个对象,才是同步的,不然是异步。


3) 同步代码块放在非同步synchronize方法中声明,并不能保证调用方法的线程的执行顺序,也就是线程调用方法是无序的。同步块中是同步的,易出现脏读。


2.2.9静态同步synchronized方法与synchronized(class)块

synchronized用在static静态方法上,就是对当前class持锁,calss锁可以对类所有对象起作用。  synchronized (class) 如 synchronized(Service.class) 代码块与 synchronized static 方法作用一样。


非静态是对对象上锁,是不一样的。


多个实例对象进入class锁时需要同步,但此时仍可以异步进入对象锁。

2.2.11同步synchronized 方法的无限等待与解决。

使用同步快来解决 synchronized(非this对象),如 new object()


2.2.12多线程的死锁

互相等待对方释放锁。

2.2.16锁对象的改变

注意在start前,锁被改变会有影响,造成异步。


若是已经start,争夺的是启动前的锁,


锁对象的属性改变,不会影响同步。


2.3volatile 关键字



2.3.1volatile 与 synchronized

volatile 提示线程从共享内存中读取变量的最新值,而不是从私有内存中读取。这样就保证了同步数据的可见性。

线程安全包括原子性和可见性两个方面 volatile 与 synchronized 的比较 1.volatile是线程轻量级的实现,性能较优;但volatile只能修饰变量。 2.多线程访问volatile不会发生阻塞,而synchronized会。 3.volatile解决变量在多个线程的可见性,不具备同步性,但不保证原子性。synchronized保证数据的原子性,间接保证可见性,解决的是多个线程访问资源的同步性,它会将私有内存和共有内存同步。

2.3.2volatile非原子特性

变量在内存中的工作过程 见补充图片

在多线程环境中,use和assign是多次出现的,但不是原子的。read 和 load之后,如果主内存变量值发生改变,线程工作内存值由于已经读取,不会发生相应改变,私有和公共内存不同步。出现非线程安全问题。

2.3.3原子类也并不完全安全

原子类在有逻辑的情况下输出结果也具有随机性。

2.3.4synchronized 有volatile同步功能。

见2.3.1 synchronized间接保证可见性。synchroni
4000
zed具有互斥性和可见性 不仅可以解决一个线程看到的对象处于不一致的状态,还可以保证进入同步方法或者代码块的每个线程,都看到同一个锁保护之前所有的修改效果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java多线程