1. java lock 是锁对象还是代码块
主要为了多线程访问共享资源时,保证只能有一个线程操作资源,比如说一个servlet中对根据参数
一个公共变量设置值
,如果不采用lock那么在并发访问时就无法保证每个线程中公共变量设置的值都是各自线程的,在后续的应用中变量的值可能会错乱,加了lock之后就保证了在一个线程中从头到尾都是一致的
2. java对象锁与类锁区别
Java每一个class都提供类似于moniter的保证同步,保护共享数据的操作。
正如你所说,notify是唤醒一个等待的线程,如果没有任何线程在等待,Notify将没有任何操作。
只有当对象上有线程陷入等待时,调用notify会唤醒第一个陷入等待的线程。
3. Java锁 到底锁的是哪个对象
锁并不是锁的对象 是锁的内存
参考下java虚拟机
4. java中synchronized锁对象的问题
censhi007 是对的。LZ你锁住某个对象b的话,那你只能保证在synchronized内调用b对象的方法或者属性的“那一句语句”时,别的线程(同样通过synchronized请求调用对象b)会被堵塞。
如果说要详细的说,那就是你在synchronized(b)m2里面,b = 2000这一句语句运行的那个时间内,m1里面的b = 1000这一句不能同时运行,会等待b = 2000运行完才运行。呃,很显然,在这里synchronized(b)连个毛用都没有了。。
但是如果你是调用b对象的某一个方法a()的话,那么在运行方法a的整个过程,m1不能同时运行方法a(),这样就有那么点用处了。。
而yzn6370823 说的在一定程度上也没错。你根本不能保证m1和m2哪一个synchronized块会被先调用。
同时,你在
public void m2()throws Exception {
synchronized(this){
b = 2000;
Thread.sleep(1000);
}
System.out.println("m2:" + b);
}
中,把 System.out.println("m2:" + b);放到synchronized外是不对的,因为你的意图应该是m2输入被锁住的时候的值吧,如果你RP不好,说不准m2就输出1000了。
5. java为什么要对对象加锁
对象是一个锁标志。按照先到先得的原则,如果有多个线程都会执行代码,并使用同一个对象作为锁,
synchronize(对象){
....
}
那么,先执行这段代码的那个线程,将会获得这个对象锁,而当这个线程执行这段代码的时候,其他线程也是使用这个对象作为锁的,就不能执行这段代码,知道最初得到这个锁的线程运行完这段代码,然后再把锁分配给下一个线程执行。
6. java中的同步代码块,为什么随便放个对象,就可以锁住代码块呢什么原理
synchronized(这里的对象你看成一道门) {
这里是一个人进来了,把门反锁了
需要同步操作的代码
这里是里面的人事情做完了,出去了,门开着其他人可以进了
}
至于怎么锁的,这是java和jvm的规定和实现细节,作为普通程序员没必要深入那么多。
7. java对象锁问题,求解
线程执行顺序是随机的,这就是多线程,synchronized只能保证结果是正确的。。因为你这个run方法是同时start的。
8. java的多线程,对象锁与对象监视器有什么区别
对象监视器用来
监视多个线程处理同一个共享数据,比如成员变量,
对于你说的那个大括号里面的对象
这个对象你可以自己定义,比如
string
str=new
stirng("11");
object
obj=new
object();这都可以
这个对象
主要用来
标示的
就好比是一个锁,如果你两个线程都要访问一个共享数据的话,当然
这个对象要是一样的,synchronized(对象){
}这里的对象
必须的有,这是规范
我说的都是理解的,简易
你最好是看看这方面的视频,线程挺重要的,