
正文
java加锁代码示例 java中的锁怎么实现
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
JAVA锁机制 有小例子说明最好!
java锁一定要保证锁住的是同一个对象。
一般来说,在方法上上锁,可以用常量字符串,或者静态字符串。看下面的例子。
public class SynTest{
private static String lock = "lockA";
private String a = "abc";
public String setA(String newStr){
/* 因为lock是静态变量,所以只要是SynTest类对象访问该方法时,都会争取这把锁
* 如果lock是成员变量的话,每个SynTest类对象都会有自己的lock变量,那样是锁不
* 上的*/
synchronized(lock){
a = newStr;
}
}
}
当然了,除了上面的方法,还可以使用最新的ReadWriteLock,它的实现与synchronized类似,但都要保证访问的是同一把锁。
相关问答
Q1: 关于JAVA中的synchronized锁定对象
synchronized的锁是针对多线程的,从线程的角度去思考才能真正弄明白。
Java的synchronized使用方法总结
1. 把synchronized当作函数修饰符时
这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。
同步块,示例代码如下:
public void method3(SomeObject so)
{
synchronized(so)
{
//…..
}
}
这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁。
3.将synchronized作用于static 函数,示例代码如下:
Class Foo
{
public synchronized static void methodAAA() // 同步的static 函数
{
//….
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(类名称字面常量)
}
}
代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。
Q2: java加锁
对象是一个锁标志。按照先到先得的原则,如果有多个线程都会执行代码,并使用同一个对象作为锁,
synchronize(对象){ .... }
那么,先执行这段代码的那个线程,将会获得这个对象锁,而当这个线程执行这段代码的时候,其他线程也是使用这个对象作为锁的,就不能执行这段代码,知道最初得到这个锁的线程运行完这段代码,然后再把锁分配给下一个线程执行。
Q3: java中 请问我应该如何如何锁这段代码才符合要求
public Object getObject(String key,Object o) {
synchronized (map) {
if(map.get(key)==null) {
map.put(key,o)
}else {
return map.get(key);
}}// 格式没法弄,自己弄一下
}
// demol0326 的回答意思使用MyTest的实例来加锁,但是map是static的,无法锁住
// MyTest的多个实例在多个线程中的请求
//禾木双子 :如果A线程在getObject方法的第二行停止,此时B线程进入getObject后执行部分代码, 此时B线程停止,A线程启动,他不会执行'多线程处理', 仍然有线程线程安全问题,(想像一下更多的线程进入该方法的情况,num甚至会得到负值)
java加锁代码示例的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java中的锁怎么实现、java加锁代码示例的信息别忘了在本站进行查找喔。







