线程的同步互斥
线程互斥与同步通信
1.线程安全问题——》银行转账问题
2.关于Synchronized
实现线程的原子性,需要把某段代码保护起来,
1 int len = name.length(); 2 synchronized (name) { //this也可以,就省的写变量名了 3 //Outputer.class在括号中使用时,就是当内部类中存在了静态构造方法,为了两者的同步,使用 4 for (int i = 0; i < len; i++) { 5 name.charAt(i); 6 } 7 System.out.println(name); 8 }
只有这样,在线程调用该方法时,就不会出现混乱执行语句。
注意:还有一个方法就是直接在方法名上加sychronized ,在一段代码中最好只用一次,如果在方法名上加了sychronized,在方法体中也用了sychronized ,就会出现死锁。
要用到共同的数据(包括同步锁)或者共同算法的若干个方法应该归在同一个类身上,这种设计正好体现了高类聚和程序的健壮性
Lock比传统线程模型中的synchronized 方式更加面向对象,锁本身也是一个对象。两个线程执行的代码要是先同步互斥的效果,他们必须用同一个lock对象。同步的代码是放在资源内部的,不是放在线程中的。