该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
synchronized有几种用法
给方法加锁也就是在声明方法时加上synchronized关键字,这样同时就只能有一个线程访问该方法
其次就是代码块,synchronized(xx){xxx}但是之前我一直不解括号里面的参数是什么..后来自己慢慢翻资料理解了一些,例如
synchronized(this){xxx} this我们都知道是指当前方法的所属类
而synchronized(变量)和synchronized(对象)的意义又是什么呢...经过摸索我发现
synchronized(){}会对2个括号内的内容都进行加锁例如
1.A a = new A();
2.synchronized(a){
3. a.k();
4. System.out,println(a.toString());
5.}
6.a.k();
当有线程执行到synchronized语句时,synchronized会将小括号里面的a对象进行加锁和对大括号里面的所有内容进行加锁,也就是这时即使在大括号外面的第6行代码a.k()实际上也是被锁的
当然如果synchronized(this)的话就代表将整个类都锁上,也就是当有线程执行到该synchronized语句时,其他只要在执行该类的线程都会被堵塞因为整个类都被锁上了
并且synchronized的参数除了要加锁的对象外还可以作为synchronized的名称,大家也都看过下面2种synchronized的写法吧
Object lock = new Object();
synchronized(lock){...}
以及
synchronized有几种用法
给方法加锁也就是在声明方法时加上synchronized关键字,这样同时就只能有一个线程访问该方法
其次就是代码块,synchronized(xx){xxx}但是之前我一直不解括号里面的参数是什么..后来自己慢慢翻资料理解了一些,例如
synchronized(this){xxx} this我们都知道是指当前方法的所属类
而synchronized(变量)和synchronized(对象)的意义又是什么呢...经过摸索我发现
synchronized(){}会对2个括号内的内容都进行加锁例如
1.A a = new A();
2.synchronized(a){
3. a.k();
4. System.out,println(a.toString());
5.}
6.a.k();
当有线程执行到synchronized语句时,synchronized会将小括号里面的a对象进行加锁和对大括号里面的所有内容进行加锁,也就是这时即使在大括号外面的第6行代码a.k()实际上也是被锁的
当然如果synchronized(this)的话就代表将整个类都锁上,也就是当有线程执行到该synchronized语句时,其他只要在执行该类的线程都会被堵塞因为整个类都被锁上了
并且synchronized的参数除了要加锁的对象外还可以作为synchronized的名称,大家也都看过下面2种synchronized的写法吧
Object lock = new Object();
synchronized(lock){...}
以及
synchronized("xxxxx"){...}
的写法,这样synchronized里面的对象对于程序的逻辑来说起不到任何意义,不过这样写肯定有它的道理,例如
Object lock_1 = new Object();
Object lock_2 = new Object();
synchronized(lock_1){...}
synchronized(lock_1){...}
synchronized(lock_2){...}
这样,有线程执行synchronized(lock_1){...}时那么下面的那个synchronized(lock_1){...}也将会被锁死而synchronized(lock_2){...}不会,这样就起到了一个区分锁的作用
不过大家还是最好先自己试验一下...我不敢保证我说的全部都是对的,如果有误望大家指出
顺便值得一提的是,多个线程被启动时,这些线程执行的run方法都是分别独立的,而不是多个线程在执行一个run方法,这样的话synchronized是无效的也是无意义的,因为以run的角度来看只有一个线程在执行它,而要让synchronized有意义就必须涉及到线程间的资源共享数据传递等,也就是多个线程需要执行一个代码,这样synchronized才是有意义的,通常个人喜欢独立些一个类负责资源共享,而synchronized就是在该类当中起到同步控制的语句