java多线程编程核心技术前夜2(synchroized)

1.声明一个线程对象thread1,thread1中有一个没有添加synchroized关键字的方法,Thread threadA=new Thread(thread1);Thread threadB=new Thread(thrad1);threadA.start();threadB.start();这是就会产生两个线程同时访问一个非同步方法,造成执行顺序不同步。

2.synchroized关键字获得的锁是对象的锁,而不是获得对一个方法或一段代码的锁,如果创建两个相同的对象,对象类中有一个方法,声明为synchroized,创建两个线程分别访问这两个对象,则这两条线程是异步(asynchroized)执行的,因为两条线程分别获得了两个对象各自的锁。如果对象类中的所有方法都加上了关键字synchroized,则两条线程访问对同一个对象中的不同方法也是同步进行的。即一条线程访问一个对象中的synchroized方法,此时它获得这个对象的锁,另外一条线程访问这个对象中的其他带synchroized关键字的方法,则这条线程需要等待获得对象锁。

3.脏读:多个线程对同一个变量进行读取的时候,由于异步执行,读取到的数据不是准确的数据,是一个被修改过的数据。

4.可重入锁:一条线程获得了一个对象的锁,这时这个对象的锁还没有被释放,如果还想再次获得这个对象的锁是可行的,这就叫可重入锁,不然就会造成死锁。可重用锁可以用在继承的环境中。即线程在子类对象中可以调用父类对象的synchroized方法。

5.如果一条线程执行出现异常,那么会释放它获得的锁。

6.同步是不存在于继承的,必须在子类中重新声明synchroized。

7.同步代码块:synchroized(this){.....};在同步代码块中的代码在执行时同步。

8.synchroized(this)和synchroized方法一样是获得当前对象的锁。

9.如将synchorized修饰static方法,则锁定的是.java文件对应的那个class类。而class锁可以对所有的类对象起作用。synchroized static方法和锁定synchroized(a.class)作用是一样的。

10.内部类和静态内部类的声明方式:外部类PublicClass。PublicClass publiccalss=new PublicClass();声明内部类PrivateClass privateclass=publicclass.new PrivateClass();声明静态内部类就和声明普通对象一样:PrivateClass privateclass=new PrivateClass();

11.volatile关键字:cpu执行命令的时候,是将内存中的数据拷贝一份到高速缓存(这里是线程数据栈)中,从高速缓存中读取命令执行。一个声明了volatile的变量,在高速缓存中被cpu读取修改,这时这个变量就能立即写回主存中。但是写回主存需要时间的,其他处理器中缓存的这个变量的值还是旧的,这是cpu就会通过嗅探在总线中传输的数据来判断这个值是否是旧的,如果cpu发现自己高速缓存中此变量的内存地址被修改,则将本地变量标记为无效,从主存中重新获取这个变量的值。此关键字能保证变量的可见性,但不能保证变量的原子性。

12.synchroizedd关键具有可见性和互斥性。可见性:一个线程 更改 了线程工作内存中的变量会立马写入到主内存。

猜你喜欢

转载自blog.csdn.net/BIGSEACOMING/article/details/80359859