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

synchronied 对象监视器为Object时的使用,或者监视器为Class时的使用。

方法中的变量不存在非线程安全问题,永远都是线程安全的,这是方法内部的变量是私有的特性造成的。

1 synchronized的使用

在方法前加关键字synchronized即可。

1)A线程先持有object对象的Lock锁,B线程可以异步的方式调用object对象中的非synchrionized类型的方法。

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

2 脏读

每个方法都加synchronized解决

3 锁重入

synchronized方法/块内部调用其他synchronized方法/块的时,是永远得到锁的。

“可重入锁”的概念是:自己可以再次获得自己的内部锁。比如有一条线程获得了某个对象的锁,此时这个对象还没有释放,当其再次想获得这个对象的锁的时候还是可以获得的,如果不可锁重入的话,就会造成死锁。

出现异常,锁就会自动释放。

同步不具有继承性,应该是发生在重写的情况下

4 synchronized同步代码块

当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一段时间内只能有一个线程被执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块以后才能执行该代码块。

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

关键字synchronized还可以运用在static静态方法上,如果这样写,那是对当前的*.java文件对应的Class类上锁。

从运行效果上看,并没有说明特别之处,都是同步的效果,和将sychronized关键字加到非static方法上使用的效果是一样的。而sychronized关键字加到非static静态方法上是给对象上锁。

数据类型String的常量池特性:在JVM中具有String常量池缓冲的功能,将

synchronized(String)同步块与String联合使用时,要注意带来的一些意外。一般不使用

同步方法容易造成死循环,用同步块试一下

5 内置类

public class PublicClass{

class PrivateClass{

}

}

PublicClass pubc = new PublicClass();

PrivateClass pric = pubc.new PrivateClass;

还有一种静态内置类

public class PublicClass{

static class PrivateClass{

}

}

本实验测试同步代码块sychronized(class2)对class2上锁后,其他线程只能以同步的方式调用class2中的静态方法

6 volatile 关键字

主要作用是使变量在多个线程间可见,但不支持原子性

i++问题

1)从内存中取出i的值;

2)计算i的值;

3)将i的值写到内存中。

对于用volatile修饰的变量,JVM虚拟机只是能保证从主内存中加载到线程工作内存的值是最新的,例如线程1和线程2在进行read和load的操作中,发生主内存中的count的值都是5,那么都会加载这个最新的值,也就是说volatile关键字解决的是变量读时的可见性问题,但无法保证原子性,对于多个线程访问同一个实例变量还是需要加锁同步。

使用原子类进行i++操作,除了操作时使用synchronized关键字实现同步外,还可以使用AtomicInt类进行实现。

sychronized代码块有volaite同步的功能:

` 关键字synchronized可以使用多个线程访问同一个资源具有同步性,而且它还具有将线程工作内存中的私有变量与公共内存中的变量同步的功能。

时间: 2024-10-08 14:05:45

第二章 对象以及变量的并发访问的相关文章

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

在现实开发中,我们写的线程肯定会有不同的实例在执行,此时就可能会出现"非线程安全问题",非线程安全就是:多个线程对同一个对象中的实例变量进行并发访问时候,有可能A和B线程同时读取到数据,先后进行更改,此时,该变量就不是我们期望的数据,也就是通常所说的"脏数据" 实例变量非线程安全 需要注意的是,方法中的变量是不存在非线程安全问题的,这是因为方法内部的变量都是私有的. 如果多个线程共同访问了一个对象中的实例变量,则可能会出现线程安全问题.看下面代码: public c

Java多线程编程核心 - 对象及变量的并发访问

1.什么是“线程安全”与“非线程安全”? “非线程安全”会在多个线程对同一对象总的实例变量进行并发访问时发生,产生的后果是“脏读”,也就是取到的数据其实是被更改过的. “线程安全”是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象. 2.非线程安全例子?怎么解决? 非线程安全 package com.jvm.thread; public class HasSelfPrivateNum { private int num =  0; public void add(String usern

(二)对象以及变量的并发访问--synchronized的使用细节,用法

具体的记录synchronized关键的各种使用方式,注意事项.感觉一步一步跟我来都可以看懂滴 大致是按照以下思路进行书写的.黑体字可以理解为结论, 1.synchronized锁的是什么? 2.synchronized能够锁住所有方法吗? 3.synchronized能够用来锁住一个方法之中的部分代码吗? 4.synchronized能够锁住除了this以外的其他对象吗?有什么用?有什么需要注意的? -----------------------------------------------

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

为什么要使用多线程编程?什么时候会出现线程安全问题? 在单线程中不会出现线程安全问题,而在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量.一个对象.一个文件.一个数据库表等,而当多个线程同时访问同一个资源的时候,就会存在一个问题: 由于每个线程执行的过程是不可控的,所以很可能导致最终的结果与实际上的愿望相违背或者直接导致程序出错. 举个简单的例子: 现在有两个线程分别从网络上读取数据,然后插入一张数据库表中,要求不能插入重复的数据. 那么必然在插入数

对象及变量的并发访问一

一.多个线程操作一个对象实例 当两个线程同时访问一个没有同步的方法,如果两个线程同时操作业务对象中的实例变量,则有可能会出现“非线程安全问题”. 1 package concurrent; 2 /** 3 * 测试不同线程操作同一个实例变量线程安全问题 4 * @author foolishbird_lmy 5 * 6 */ 7 class ThePrivateNumber{ 8 private int num = 0; 9 10 public synchronized void addI(St

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

1 . 多个线程访问多个对象JVM会创建多个锁.2 . 静态方法是以类为单位进行同步的--对于同一个类中的所有静态方法,在同一时间内,只允许有一个线程执行其中的一个静态方法,其余想要进入这些方法的线程都必须挂起等待.非静态方法是以对象为单位进行同步的.3 .假设现有两个线程A和B,一个object对象,当线程A调用object对象的一个同步方法M1时,线程A就获得了M1方法所在对象的锁,所以其他线程必须等待线程A执行完毕之后才能调用方法M1,如果线程B调用object的同步方法M2,必须等待线程

Java多线程编程(二)对象及变量的并发访问

一.synchronized同步方法 1.方法内的变量为线程安全 2.实例变量非线程安全 3.多个对象多个锁 4.synchronized方法与锁对象 5.脏读 6.synchronized锁冲入 7.出现异常,锁自动释放 8.同步不具有继承性 二.synchronized同步语句块 1.synchronized方法的弊端 2.synchronized同步代码块的使用 3.用同步代码块解决同步的弊端 4.一半异步,一半同步 5.synchronized代码块间的同步性 6.验证同步synchro

第二章 数据,变量和计算

头文件 #include <>或#include "" <> 强制类型转换 double a=1.6; cout<<static_cast<int>(a)<<endl; 输出为1 注意旧的强制类型转换为int(a),这比新的更容易出错,得不到想要的结果,所以推荐static_cast<转换成的类型>() 自动判断数据类型 auto n=16; 自动判断n的类型为int const auto e=1.1; 自动判断静

Java第二章----对象和类

从第一章到第二章整整隔了一个月的时间,这速度也是慢的无语了.因为这个月负责开发公司一个SaaS类型APP,忙的昏天暗地终于上线了,这才有时间写个博客.本章还是以概念为主,有点枯燥重在理解. 第一节:对象 名词解释 OOA-Object Oriented Analysis-面向对象分析 OOD-Object Oriented Design-面向对象设计 OOP-Object Oriented Programming-面向对象程序设计 面向对象基本特性 万物皆可为对象:任何一件事物都可以表示为程序中