美文网首页
Java Thread:(1) synchronization

Java Thread:(1) synchronization

作者: 戈壁堂 | 来源:发表于2021-04-26 20:20 被阅读0次

    第二版,1999年第三版,2004年,可对照看。

    一个类中的多个synchronized的方法:针对当前对象,同一时间多个线程只能执行其中的一个synchronized的方法。因为锁是针对对象的,并且每个对象只有一个锁token。

    静态方法的synchronized同步锁被称为class lock(只是一种概念,实际上加锁的是一个静态对象?):静态方法中传入实例对象引用,依然可以继续调用对应实例的同步方法。因为这是两把不同的锁。

    第一版本BusyFlag——

    public class BusyFlag {
    
        protected Thread busyflag = null;
        protected int busycount = 0;
    
        public void getBusyFlag() {
            while (!tryGetBusyFlag()) {
                try {
                    Thread.sleep(100);
                } catch (Exception e) {}
            }
        }
    
        public synchronized boolean tryGetBusyFlag() {
            if (busyflag == null) {
                busyflag = Thread.currentThread();
                busycount = 1;
                return true;
            }
            if (busyflag == Thread.currentThread()) {
                busycount++;
                return true;
            }
            return false;
        }
        public synchronized void freeBusyFlag () {
            if (getBusyFlagOwner() == Thread.currentThread()) {
                busycount--;
                if (busycount == 0)
                    busyflag = null;
            }
        }
        public synchronized Thread getBusyFlagOwner() {
            return busyflag;
        }
    }
    
    • synchronized关键字可以赋予整个方法,也可以赋予代码块——使用哪种方式取决于个人选择,只要避免死锁问题即可
    • freeBusyFlag()方法和getBusyFlagOwner()方法都添加了synchronized关键字;并且前者方法体中还调用了后者。

    这种情况并不会造成死锁(后者不需要等待前者释放锁之后再执行)。实际上,如果当前线程已经获取了锁,是不需要在等待锁被释放,然后再去获取一次。所以从freeBusyFlag()方法中调用getBusyFlagOwner()方法没有问题。
    引申含义是,如果开始执行同步方法时没有进行获取锁的操作的话,执行完同步方法也就不存在释放锁的动作。

    相关文章

      网友评论

          本文标题:Java Thread:(1) synchronization

          本文链接:https://www.haomeiwen.com/subject/dcserltx.html