知识点
- 方法中的变量都是线程安全的,不会被外部变量改变值.
- 只有共享的资源才需要同步化,如果不是共享的,没有必要同步
- 如果锁同一个对象,则只有等一个方法释放锁之后,才会执行下一个方法.
例如:String str=new String();
String str = new String();
synchronized public void methon1 (str){
}
synchronized public void methon2 (str){
}
如果在执行methon1,则methon2需要等methon1释放str锁,才可以执行.
4. 多线程容易造成脏读, 例如下面案例
public String username ="A";
public String password ="AA";
public synchronized void methon1(String username,String password){
try{
this.username=username;
Thread.sleep(5000);
this.password = password;
}catch (InterruptedException e){
System.out.println(e.getMessage());
}
}
public void getValue(){
System.out.println(username+password);
}
当多个线程启动时,传入参数("B","BB"),因为此时 线程还在睡眠,password没有赋值,所以此时调用getValue方法,则显示A+BB
5. 多个线程启动synchronized方法需要同步执行,非synchronized方法异步执行.
6.可重入锁:可以再次获取自己的内部锁.比如:有一个线程获得了某个对象的线程锁,此时锁还没有释放,当其想再次获得这个对象锁的时候,还是可以获取的,如果锁不重入的话,容易造成死锁.
7. 关键字synchronized取得的锁都是对象锁,而不是把一段代码或函数当作锁.
8. 如果出现异常,锁自动释放.
9. 同步不具有继承性.如果父类方法有关键字synchronized,子类还需要在方法加synchronized关键字.
10. synchronized弊端:如果一个线程执行时间较长,则其余线程等待时间较长,这种效率低下.可以采用同步语句块来解决.
11. 当两个并发线程访问同一个对象Object中的synchronized(this)同步代码块时,一段时间内只有一个线程被执行,另一个线程必须等待当前线程执行完这个代码语句块以后才能执行该代码语句块.
12. 当一个线程访问Object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象中的synchronize(this)同步代码块.
13. 一半同步,一半异步.不在synchronized块中的就是异步,在synchronized块里面就是同步.
14. 在使用同步synchronized(this)代码块时,需要注意的是,当一个线程访问object的一个synchronized(this)时,其他线程对该object中所有其他synchronized(this)同步代码块的访问将被堵塞.
15.和synchronized方法一样,synchronized(this)代码块也是锁定当前对象的.
16. 多个线程调用同一个对象中的不同名称的synchronized同步方法或synchronized(this)同步代码时,调用的效果就是按顺序执行,也就是同步的,堵塞的.
17. 锁非this对象具有一定的优点:如果在一个类中有很多个synchronized方法,这时虽然能实现同步,但会收到堵塞,,所以影响运行效率;但如果使用同步代码块锁非this对象,则synchronized(非this)代码块中的程序与同步方法是异步的,不与其他锁this同步方法争抢this锁,则可大大提高运行效率.
18. synchronized(非this对象x) 格式的写法是将x对象本身作为"对象监视器",可以得出下面三个结论:
(1).当多个线程同时执行synchronized(x){}同步代码块时,呈同步效果
(2)当其他线程执行x对象中synchronized同步方法时呈同步效果
(3)当其他线程执行x对象方法里面的synchronized(this)代码块时也呈现同步效果.
18. 关键字synchronized还可以应用在static静态方法上,如果这样写,那是对当前*.java文件对应的class类进行持锁.而synchronized关键字加到非static静态方法上分是给对象上锁.
19. class锁可以对类的所有对象实例起作用.
20. 同步synchronized(class)代码块的作用其实和synchronized static方法的作用一样.
21. 大多数情况下,同步synchronized代码块都不实用String作为锁对象,因为String会有常量池
22. 如果线程互相等待,很容易造成死锁.
23.volatile关键字主要作用是使变量在多个线程间可见.强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. (修改变量的时,使多个线程的值同步).解决多个线程之间到的可见性.
24. 关键字synchronized可以使多个线程访问统一资源具有同步性,而且它还具有将线程工作内存中的私有变量与公共内存中的变量同步的功能.
25. start 是并行执行,start之后线程处于就绪状态,然后交给cpu调度,由cpu决定去执行哪一个线程,但是run是直接执行串行执行。
例如 th1.run;th2.run 要先执行完th1.run 在执行th2.run
电脑坏了,空格键坏了,这没办法搞了.