C/C++教程

synchronized部分简单用法

本文主要是介绍synchronized部分简单用法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

synchronized修饰静态/非静态方法

 public static void main(String[] args) {
        Thread t1 = new Thread() {
            @Override
            public void run() {
                Person.m1("线程1");
            }
        };
        Thread t2 = new Thread() {
            @Override
            public void run() {
                Person.m1("线程2");
            }
        };
        t1.start();
        t2.start();
    }

public class Person {

public synchronized static void m1(String x) {
        System.out.println(x + "ing");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(x + "执行");
    }
}

在有synchronized修饰静态方法时,线程1和线程2有一个会先执行,此时就会锁住,知道执行结束才会释放锁,另一个线程才会执行。

synchronized修饰静态方法可以叫类锁,当执行一个带锁的方法,其他静态带锁的方法就不能执行了(静态的存在方法区)。

synchronized修饰非静态方法和修饰静态方法一样,只不过是在堆中,一个对象调用synchronized修饰的非静态方法时,其他非静态带锁的也不能执行了。

加锁的和不加锁的互不影响,不是同一个对象的锁互不影响,不是同一类的锁也互不影响。

读要在写之后

public static void main(String[] args) {
        Person p = new Person();
        Thread t1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 100000; i++) {
                    p.m1(1);
                }
            }
        };
        Thread t2 = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 100000; i++) {
                    p.m1(1);
                }
            }
        };
        t1.start();
        t2.start();
        try {
            t1.join();        //不用这个主线程大概会先执行完
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(p.getMoney());
    }
public class Person {

    public static int money = 0;

    public synchronized static void m1(int x) {
        money += x;
    }

    public synchronized int getMoney() {
        return money;
    }

    public synchronized static void setMoney(int x) {
        money = x;
    }
}

x.join就是线程x执行完后面的代码才会执行。

。。。未完

这篇关于synchronized部分简单用法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!