synchronized锁失效
代码如下:
package com.wn.thread;
public class SynchronizedTest extends Thread {
public synchronized void f(String name, int i){
System.out.println(name+"调用了f"+i+"次");
}
public synchronized void g(String name, int i){
System.out.println(name+"调用了g"+i+"次");
}
public static void main(String[] agrs){
SynchronizedTest st=new SynchronizedTest();
test t=new test(st);
test1 t1=new test1(st);
t.start();
t1.start();
}
}
class test extends Thread{
SynchronizedTest st;
test(SynchronizedTest st){
this.st=st;
}
@Override
public void run() {
this.setName("线程1");
for(int i=0;i<1000;i++){
st.f(this.getName(), i+1);
}
}
}
class test1 extends Thread{
SynchronizedTest st;
test1(SynchronizedTest st){
this.st=st;
}
@Override
public void run() {
this.setName("线程2");
for(int i=0;i<1000;i++){
st.g(this.getName(), i+1);
}
}
}
输出(一部分)是:
线程2调用了g174次
线程2调用了g175次
线程2调用了g176次
线程2调用了g177次
线程2调用了g178次
线程2调用了g179次
线程2调用了g180次
线程2调用了g181次
线程2调用了g182次
线程2调用了g183次
线程2调用了g184次
线程1调用了f1次
线程1调用了f2次
线程1调用了f3次
线程1调用了f4次
线程1调用了f5次
线程1调用了f6次
线程1调用了f7次
线程1调用了f8次
为什么线程2还没有执行外线程1就开始执行了?
另外,明明线程1先执行的statr()方法呀,为啥线程2先执行?
跪求高手解释
package com.wn.thread;
public class SynchronizedTest extends Thread {
public synchronized void f(String name, int i){
System.out.println(name+"调用了f"+i+"次");
}
public synchronized void g(String name, int i){
System.out.println(name+"调用了g"+i+"次");
}
public static void main(String[] agrs){
SynchronizedTest st=new SynchronizedTest();
test t=new test(st);
test1 t1=new test1(st);
t.start();
t1.start();
}
}
class test extends Thread{
SynchronizedTest st;
test(SynchronizedTest st){
this.st=st;
}
@Override
public void run() {
this.setName("线程1");
for(int i=0;i<1000;i++){
st.f(this.getName(), i+1);
}
}
}
class test1 extends Thread{
SynchronizedTest st;
test1(SynchronizedTest st){
this.st=st;
}
@Override
public void run() {
this.setName("线程2");
for(int i=0;i<1000;i++){
st.g(this.getName(), i+1);
}
}
}
输出(一部分)是:
线程2调用了g174次
线程2调用了g175次
线程2调用了g176次
线程2调用了g177次
线程2调用了g178次
线程2调用了g179次
线程2调用了g180次
线程2调用了g181次
线程2调用了g182次
线程2调用了g183次
线程2调用了g184次
线程1调用了f1次
线程1调用了f2次
线程1调用了f3次
线程1调用了f4次
线程1调用了f5次
线程1调用了f6次
线程1调用了f7次
线程1调用了f8次
为什么线程2还没有执行外线程1就开始执行了?
另外,明明线程1先执行的statr()方法呀,为啥线程2先执行?
跪求高手解释
...全文
相关推荐
Java Synchronized锁失败案例及解决方案
Java Synchronized锁是一种同步机制,用于解决多线程并发访问共享资源的问题。但是,如果锁定的对象发生改变,那么锁将失效,导致线程安全问题。
详解java并发编程(2) --Synchronized与Volatile区别
在Java内存模型中,Synchronized可以确保线程之间的可见性。当一个线程A将最新的共享变量刷新到主内存的时候,会导致缓存在其他线程B的工作内存的这个共享变量失效。
高并发事务与锁失效解析[代码]
但这种方式可能会导致较高的锁竞争和事务等待,影响系统的并发性能。锁失效的一个常见场景是当事务包含悲观锁时,如果不正确处理,可能会导致死锁或锁释放不当。
java多线程编程之使用Synchronized块同步变量
`synchronized`关键字有两种主要的使用方式:synchronized 方法和 synchronized 块(也称为监视器锁)。
Java并发底层实现原理学习心得
这条指令不仅会将当前处理器的缓存行数据回写到内存,还会使其他处理器缓存该内存地址的数据失效,从而确保了多处理器环境下的数据一致性。此外,volatile还避免了指令重排序,保证了可见性。


