标签:问题 sync str 范围 多个 控制 固定 同步 线程同步
? 线程安全问题的根本原因:
A:存在多线程环境
B:存在两个或两个以上的线程对象共享着一个资源(多个线程共享数据)
C:有多条语句操作共享数据
? 同步代码块:
synchronized( 锁对象 ){
需要同步的代码;
}
注 1.任意一个对象都可以作为锁对象
(凡是对象的内部都维护了一个状态,Java同步机制就是使用了对象中的状态作为锁的标识)
2.在同步代码块中调用sleep方法并不会释放锁对象
3.同步代码块会降低效率
4.多线程操作的锁对象必须是唯一共享的,否则无效
(""括起来的字符串能锁,new String()创建出的字符串锁不住)
? 同步函数:
访问修饰符 synchronized 返回值 方法名(){
需要同步的代码;
}
访问修饰符 static synchronized 返回值 方法名(){
需要同步的代码;
}
注 1.如果是一个非静态的同步方法的锁对象是this对象
2.如果是一个静态的同步方法的锁对象是当前函数所属类的字节码文件(class对象)
? 锁对象:
同步代码块的锁对象: 任意对象。
同步方法的锁对象: this
静态方法的锁对象: 类的字节码文件对象。(类名.class)
注: 多个线程必须使用的是同一个锁对象
? 推荐使用同步代码块:
1. 同步代码块的锁对象可以由我们随意指定,方便控制
同步函数的锁对象是固定的,不能由我们来指定
2. 同步代码块可以很方便控制需要被同步的代码的范围
同步函数必须是整个函数的所有代码都被同步了
? 同步的优劣:
好处: 同步的出现解决了多线程的安全问题。
弊端:会降低程序的运行效率。
会产生死锁现象(两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象)。
标签:问题 sync str 范围 多个 控制 固定 同步 线程同步
原文地址:https://www.cnblogs.com/bbbbbbbb1og/p/9747335.html