美文网首页
Synchronized锁的使用

Synchronized锁的使用

作者: 鼾声鼾语 | 来源:发表于2019-12-03 08:28 被阅读0次

    ①多个线程访问同一个对象的同一个方法

    public class synchronizedTest implements Runnable {
        //共享资源
        static int i =0;
        /**
         * synchronized 修饰实例方法
         */
        public synchronized void increase(){
            i++;
        }
        @Override
        public void run(){
            for (int j =0 ; j<10000;j++){
                increase();
            }
        }
        public static void main(String[] args) throws InterruptedException {
            synchronizedTest test = new synchronizedTest();
            Thread t1 = new Thread(test);
            Thread t2 = new Thread(test);
            t1.start();
            t2.start();
            t1.join();
            t2.join();
            System.out.println(i);
        }
    }
    

    结果:2000
    分析:当两个线程同时对一个对象的一个方法进行操作,只有一个线程能够抢到锁。因为一个对象只有一把锁,一个线程获取了该对象的锁之后,其他线程无法获取该对象的锁,就不能访问该对象的其他synchronized实例方法,但是可以访问非synchronized修饰的方法
    ②一个线程获取了该对象的锁之后,其他线程来访问其他synchronized实例方法现象 举栗

     public synchronized void method1() {
            System.out.println("Method 1 start");
            try {
                System.out.println("Method 1 execute");
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Method 1 end");
        }
    
        public synchronized void method2() {
            System.out.println("Method 2 start");
            try {
                System.out.println("Method 2 execute");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Method 2 end");
        }
    
    
            public static void main(String[] args) {
                final syncTest test = new syncTest();
    
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        test.method1();
                    }
                }).start();
    
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        test.method2();
                    }
                }).start();
            }
    
    image.png

    分析:可以看出其他线程来访问synchronized修饰的其他方法时需要等待线程1先把锁释放
    参考博客:https://blog.csdn.net/zjy15203167987/article/details/82531772

    相关文章

      网友评论

          本文标题:Synchronized锁的使用

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