Java多线程摘要--对象及变量的并发访问

标签: Java 多线程
5人阅读 评论(0) 收藏 举报
分类:

1:”非线程安全”问题在于”实例变量”中,如果是方法内部的私有变量,则不存在”非线程安全”问题.

2:关键字synchronized取得的都是对象锁,而不是把一段代码或方法(函数)当做锁, 所以哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象.

(注:如果多个线程访问多个对象,则JVM会创建多个锁)==

3:A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法

4:A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法,则需要等待,也就是同步

5:一个synchronized方法/块的内部调用的其他synchronized方法/块时,是永远可以得到锁的.

6:当存在父子类继承关系时,子类是完全可以通过”可重入锁”调用父类的同步方法的.

7:出现异常的锁被自动释放.

8:在使用同步synchronized(this)代码块时需要注意的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object中的所有其他synchronized(this)同步代码块的访问将被阻塞,这说明synchronized使用的”对象监视器”是一个.

9:synchronized代码块具有同步性

10:synchronized(this)代码块是锁定当前对象的

(1)synchronized同步方法

1)对其他synchronized同步方法或synchronized(this)代码块调用呈阻塞状态
2)同一时间只有一个线程可以执行synchronized同步方法中的代码

(2)synchronized(this)同步代码块

1)对其他synchronized同步方法或synchronized(this)代码块调用呈阻塞状态
2)同一时间只有一个线程可以执行synchronized(this)同步代码块中的代码

11:对于synchronized(非this对象x)同步代码块

1)在多个线程持有”对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码

2)当持有”对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码

12:同步代码块放在非同步synchonized方法中进行声明,并不能保证调用方法的线程的执行同步/顺序性,也就是线程调用方法的顺序是无序的,虽然在同步块中执行的顺序是同步的,这样极易出现”脏读”问题

同步代码块

13:”synchronized(非this对象x)”格式的写法是将x对象本身作为”对象监视器”,这样就可以得出以下3个结论:

1)当多个线程同时执行synchronized(x){}同步代码块时呈现同步效果.

2)当其他线程执行x对象中synchronized同步方法时呈现同步效果.

3)当其他线程执行x对象方法里面synchronized(this)代码块时也呈现同步效果.

14:synchronized关键字加到static静态方法上是给Class类上锁,而synchronized关键字加到非static静态方法上是给对象加锁

15:异步的原因是持有不同的锁,一个是对象锁,一个是Class锁,而Class锁可以对类的所有对象实类起作用,同步synchronized(Class)代码块的作用其实和synchronized static方法的作用是一样的

16:将synchronized(String)同步块与String 联合使用时,要注意常量池以带来的一些例外.,因此在大多数的情况下,同步synchronized代码块都不使用String作为锁对象,而改用其他.比如new Object() 实例化一个Object对象,但它并不放入缓存中.

17:只要对象不变,即使对象的属性被改变,运行的结果还是同步的.

18:关键字volatile的主要作用是使变量在多个线程间可见

19:关键字volatile的作用是强制从公共堆栈中取变量的值,而不是从线程私有数据栈中取得变量的值

20:关键字与synchronized进行比较:

1)关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块
2)多线程访问volatile不会发生阻塞,而synchronized会出现阻塞
3)volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据同步.
4)关键字volatile解决的是变量在多个线程之间的可见性;而synchronized关键字解决的是多线程之间访问资源的同步性

21:volatile关键字只有可见性,不具备同步性,也就不具备原子性.

22:原子类也并不完全安全,因为方法是原子性的,但是方法和方法之间的调用却不是原子性的,解决还需要synchronized

查看评论

Win2000中用户自定义IP头的实现及OicqSend完整实例源程序

Win2000中用户自定义IP头的实现及OicqSend完整实例源程序by孤独剑客E-mail: janker@371.net HomePage: http://janker.126.com一、引子 ...
  • yagami
  • yagami
  • 2000-09-06 23:26:00
  • 883

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

Java对象及变量的并发访问当多个线程同时对同一个对象中的实例变量进行并发访问时可能会产生线程安全问题。产生的后果就是”脏读”,即收到的数据其实是被更改过的。 如果访问的是方法中的变量,则不存在”非...
  • a815060271
  • a815060271
  • 2017-02-21 21:35:52
  • 456

java多线程(对象和变量的并发访问)

在现实开发中,我们写的线程肯定会有不同的实例在执行,此时就可能会出现”非线程安全问题”,非线程安全就是:多个线程对同一个对象中的实例变量进行并发访问时候,有可能A和B线程同时读取到数据,先后进行更改,...
  • mockingbirds
  • mockingbirds
  • 2016-07-11 09:37:42
  • 6818

Java多线程/并发12、多线程访问static变量

类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类;实例成员则属于对象,即类的实例。 先看一个类:public class stat...
  • soonfly
  • soonfly
  • 2017-04-28 16:46:05
  • 2795

Java中,对多线程访问同一变量(并发访问)的认识

在Java中,如果启动多个线程对同一个对象或者变量时候,在没有安全保护前提下有可能会抛出并异常 java.util.ConcurrentModificationException 当方法检测到对象...
  • gaosililin
  • gaosililin
  • 2016-02-16 11:41:16
  • 1429

JAVA多线程-对象及变量的并发访问(一)synchronized详解

一、synchronized同步方法 1.1 方法内的变量为线程安全     非线程安全的问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了...
  • qq_26504875
  • qq_26504875
  • 2016-02-20 09:07:03
  • 2571

关于线程并发访问全局变量问题

1.两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的? void foo(){ ++a; printf("%d ",a); } A、3 2 B、2...
  • likika2012
  • likika2012
  • 2014-03-29 15:34:10
  • 3650

java多线程之对象的并发访问

1.synchronized同步方法 --1.1方法内的变量是线程安全的 解释:由于方法内的变量是私有的,本体访问的同时别人访问不了,所以是线程安全的。 --1.2实例变量是非线程安全的 解释...
  • ya_1249463314
  • ya_1249463314
  • 2016-09-18 09:11:27
  • 6036

多线程并发访问同一个对象时发生死锁的反思

来源:http://blog.csdn.net/lezhiyong      背景:SipPhone终端与多个其他设备的用户视频互通,由于Sip终端只能显示一路视频,所以模块A采用轮询方式将多个用...
  • lezhiyong
  • lezhiyong
  • 2012-07-25 20:32:10
  • 4640

Java多线程并发编程之变量

编写线程安全需要关心的: 共享的变量 可变的变量 共享意味着多个线程可以同时访问,可变意味着其值在生命周期可以改变。 例如以下count 变量: //线程...
  • csujiangyu
  • csujiangyu
  • 2015-03-12 09:49:48
  • 944
    个人资料
    等级:
    访问量: 8671
    积分: 204
    排名: 36万+