对象锁也叫方法锁与类锁不同。对于对象锁是针对一个对象的,它只是在内存中的某个内存位置声明一个
标志位标识该对象是否拥有锁,所以它只会锁住当前对象。一般一个对象是对一个非静态成员变量进行synchronized
修饰,或者对一个非静态方法进行synchronized修饰。对于对象锁,不同的对象访问同一个被synchronized修饰的
方法的时候不会被阻塞住。
类锁是锁住整个类的,当有多个线程来声明这个类的对象的时候将会被阻塞,直到拥有这个类锁的对象被销毁或者主
动释放了类锁。这时候被阻塞住的线程被挑选出一个占有该类锁声明该类的对象,其他线程继续被阻塞住。
问:synchronized方法不是以时间换空间吗?为了保证其同步性并不会让多线程同时操作集中的数据,而此
处讲到不同对象访问被synchronized修饰的方法或变量并不会被阻塞,是指并行操作其中的数据吗?或者说仅在同一
线程内的不同对象访问同一个被synchronized修饰的方法不会被阻塞?那被synchronized修饰的变量或方法其中的数
据不是被监视器所监视吗?其内的数据不是只能一个拥有监视锁的线程所操作吗?其余没有监视锁的线程不是在锁池
等待吗?那不同对象按JVM说的都具备各自的锁,那怎么还会说不同对象访问被synchronized修饰的方法或变量不会被
阻塞呢?是因为不同对象都是同一线程吗?那监视器岂不是只对线程有用?这样说来synchronized关键字对单线程是
没有用的。根据类锁的特性一个类的对象只能被一个线程所持有对吧?或者说只能有一个对象持有类锁,那持有类锁的
意思就是可以访问类里被监视器监视的数据是吗?那如果多个线程持有同一个类的对象有没有什么办法绕过类锁呢?
必须要之前持有类锁的对象消亡或者放弃吗?还有就是类锁存在的意义是什么呢?是为了保护被synchronized关键字
修饰的数据的同步性吗?这样说来类锁和监视锁的功能岂不是重合了?还有不是有volatile关键字吗?如果使用volatile
关键字而不是用synchronized呢?由于volatile的免锁机制,那请问类锁对象锁等是不是都对其没有意义?那监视锁呢?也没有了意义了吧?增加了volatile关键字的数据多线程共用因其不使用寄存器的值是不是不会出现异步现象呢?
或者说它和synchronized有很大的差别?我小白自学的,对于多线程发现这个监视器讲的很抽象不易理解就找资料,然后
看到监视锁又发现对象锁和类锁,所以还多不明白,希望明白的师兄给解解惑多谢,发现多线程里的好多机制不是很好理解。 |
|