synchronized

来源:互联网 发布:mysql 小于号转义 编辑:程序博客网 时间:2024/05/19 07:11

1、如果某个方法中有wait(),此方法必须用sychronized修饰,不然会报java.lang.IllegalMonitorStateException。


2、如果是局部变量的话,那不存在线程安全问题,因为 JVM 会为每个线程开僻自己的空间,像局部变量都运行在自己的线程空间中,互不影响。但是一些共享的成员变量,就不是放在自己的空间中了,只会保存一个,多个线程可以“同时”进行操作。


3、

class Test { static synchronized void classMethod() { }//static级别的锁,锁 Test.class 类对象 }synchronized void instanceMethod() { //instance级别的锁,锁 this 对象 }void lockerMethod() { synchronized("locker") {//锁 locker 对象//就是多线程同步访问locker //即一个线程完成对locker的请求/响应,离开synchronized块以后,其它线程才能访问locker } } }}}}


4、

public class DeadThread extends Thread{static Integer a = new Integer(0);static Integer b = new Integer(0);boolean flag;public void run() {if (flag) {synchronized (a){a = new Integer(a.intValue()+1);System.out.println(Thread.currentThread().getName()+"拿到 a  "+a);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (b){//b = new Integer(b.intValue()+1);System.out.println(Thread.currentThread().getName()+"拿到b  " +b);};};System.out.println("true over");}else {synchronized (b) {b = new Integer(b.intValue()+1);System.out.println(Thread.currentThread().getName()+"拿到b  "+b);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized(a) {//a = new Integer(a.intValue()+1);System.out.println(Thread.currentThread().getName()+"拿到a  "+a);}}System.out.println("false over");}}public DeadThread(boolean flag) {this.flag = flag;}public static void main(String[] args) {DeadThread d1 = new DeadThread(true);d1.start();DeadThread d2 = new DeadThread(false);d2.start();}}

输出

Thread-0拿到 a  1
Thread-1拿到b  1
Thread-0拿到b  1
Thread-1拿到a  1
true over

false over


完全没有死锁,因为a、b是类,不是基本数据类型,是指向对象的引用;由于对象发生了变化,a、b的地址也发生了变化,而锁是针对地址的,所以就不会出现死锁。

5、

public class DeadThread extends Thread{static Integer a = new Integer(0);static Integer b = new Integer(0);boolean flag;public void run() {if (flag) {synchronized (a){//a = new Integer(a.intValue()+1);System.out.println(Thread.currentThread().getName()+"拿到 a  "+a);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (b){//b = new Integer(b.intValue()+1);System.out.println(Thread.currentThread().getName()+"拿到b  " +b);};};System.out.println("true over");}else {synchronized (b) {//b = new Integer(b.intValue()+1);System.out.println(Thread.currentThread().getName()+"拿到b  "+b);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized(a) {//a = new Integer(a.intValue()+1);System.out.println(Thread.currentThread().getName()+"拿到a  "+a);}}System.out.println("false over");}}public DeadThread(boolean flag) {this.flag = flag;}public static void main(String[] args) {DeadThread d1 = new DeadThread(true);d1.start();DeadThread d2 = new DeadThread(false);d2.start();}}

输出

Thread-1拿到b  0
Thread-0拿到 a  0


出现死锁。

原创粉丝点击