《java多线程编程核心技术》读书笔记2.1

来源:互联网 发布:samba windows 无权限 编辑:程序博客网 时间:2024/06/05 06:29

第二章 对象及变量的并发访问


本节主要总结了一些synchronized的使用方法:

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


synchronized加在方法的前部:

       synchronized取得的锁都是对象锁,而不是把一段代码或方法当作锁,在线程的执行过程当中,哪个线程先执行了带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,那么其他线程只能等待,前提是多个线程访问的是同一个对象的synchronized方法。如果多个线程访问多个对象,则JVM会创建多个锁。

     如果一个线程已经持有了一个对象的锁,另外一个线程则不能访问该对象的同步方法,但是可以访问该对象的非同步方法。


    同步不具有继承性,如果父类的某个方法拥有synchronized关键字,子类的该方法若想同步必须手动的加入synchronized关键字;


synchronized同步代码块synchronized(this):一个线程如果访问了同步代码块中的代码,另一个线程不可以访问该对象的任何同步代码块,但可以访问非同步代码块。同步代码块锁定的也是当前对象。


将任意对象作为监视器:synchronized(非this对象)

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

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



三个结论:

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

当其他线程执行x对象中的synchronized同步方法时呈同步效果。

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

如果其他线程调用不加synchronized关键字方法时,还是异步调用。


静态同步:有两种一种在静态方法前面加上synchronized关键字,一种是synchronize(class)

关键字加到static方法上是给Class上锁,加到非static是给对象上锁。


class锁可以对类的所有实例起作用,即就是在任何时候,只能有一个线程访问该类的static方法。因为static方法就是类方法。




关于锁是字符串的情况:

     由于java中String常量池的存在,在程序中str1 = "AA",与str1 = "AA"实际是指向一个形同的对象,所以在应用锁的时候synchronized(str1)与synchronized(str2)请求的是同一个锁。因此在大多数情况下,同步synchronized代码块都不使用String作为锁对象。改用其他的。


为了避免线程的长时间等待,应尽可能的使用synchronized同步代码块,少用synchronized方法。


在任何数据类型作为同步锁时,需要注意的是,是否有多个线程同时持有锁对象,如果同时持有相同的锁对象,则这些线程之间是同步的,如过分别获得锁对象,则这些线程之间是非同步的。















0 0
原创粉丝点击