初步理解,使用线程同步synchronized

早就学过线程同步,在真正做东西的时候发现自己的理解很是浅薄,可以说理论看似可以,操作真的low,花了点时间理解了,并总结,也没很深入

  • 一个方法,加了synchronized就能线程同步了
    这个说法很抽象,再说的稍微具体
  • 一个方法,加了synchronized就相当于给这个方法加上锁,一个线程进来后,其他方法就拿不到这个锁直到这个方法结束,释放锁,别人才能拿到

emmmm..,这个理论听起来是很对,但在做联机的时候,我遇到了其中之一的问题

问题:

客户端A,客户端B,分别发送给服务器加入房间的消息,在服务器中把A,B加入到房间列表中

这个问题现在看来很是简单,但是之前的我没有理解线程同步,只要方法加上synchronized,就ok了,结果可想而知

再次回到理论发现我并没有理解锁的意思,锁是什么?
看了下面的代码

/**
 * 启动3个线程,运行10次,依次打印出10次A,B,C
 */
public class Test implements Runnable {     

    private String name;     
    private Object prev;         

    private Test(String name, Object prev) {     
        this.name = name;     
        this.prev = prev;          
    }     

    @Override    
    public void run() {     
        int count = 10;     
        while (count > 0) {     
            synchronized (prev) {        
                System.out.print(name);     
                count--;    
            }     
        }     
    }     

    public static void main(String[] args) throws Exception {     
        Object a = new Object();        
        Test pa = new Test("A", a);     
        Test pb = new Test("B", a);     
        Test pc = new Test("C", a);     


        new Thread(pa).start();   
        new Thread(pb).start();     
        new Thread(pc).start();       
    }     
}    

运行结果:
这里写图片描述

再次回到理论,每个对象仅有并且只有一个锁
感觉换了说法理解起来更加方便,所有东西都为对象,所有对象都为锁,这里的对象a就是锁,来控制3个线程顺序,pa线程先获取到这个对象,其它线程pb,pc都要等待pa线程结束才能获取对象a,这就完成了线程的同步

猜你喜欢

转载自blog.csdn.net/zbbzb/article/details/79483978