java线程&&并发-实践笔记

来源:互联网 发布:dbc2000 传奇数据库表 编辑:程序博客网 时间:2024/06/18 08:56

好文链接:
深入理解java内存模型系列文章

评论相当精彩:java中volatile关键字的含义


同步块执行顺序

调用方法如下:

        for (int i = 0; i < 5; i++) {            final int index = i;            new Thread(new Runnable() {                @Override                public void run() {                    if (index == 0) {//第一个线程执行methodB,其他的线程执行methodA                        CldSyncUtil.methodB();                    } else {                        CldSyncUtil.methodA();                    }                }            }).start();        }
public class CldSyncUtil {    public static void methodA() {//都不加锁        Log.i("clp", "methodA");    }    public static void methodB() {//都不加锁        Log.i("clp", "method B start");        try {            Thread.sleep(5000);        } catch (Exception e) {            e.printStackTrace();        }        Log.i("clp", "method B end");    }}
05-09 08:44:57.209 5553-5632/com.example.demo I/clp: methodA05-09 08:44:57.209 5553-5633/com.example.demo I/clp: methodA05-09 08:44:57.209 5553-5631/com.example.demo I/clp: methodA05-09 08:44:57.209 5553-5630/com.example.demo I/clp: method B start05-09 08:44:57.209 5553-5634/com.example.demo I/clp: methodA05-09 08:45:02.209 5553-5630/com.example.demo I/clp: method B end

RE:随意执行,线程之间互相不影响。

在methodB方法体中增加同步方法synchronized

public class CldSyncUtil {    public static void methodA() {//不加锁        Log.i("clp", "methodA");    }    public static synchronized void methodB() {//加锁        Log.i("clp", "method B start");        try {            Thread.sleep(5000);        } catch (Exception e) {            e.printStackTrace();        }        Log.i("clp", "method B end");    }}
05-09 08:48:13.899 5553-9553/com.example.demo I/clp: method B start05-09 08:48:13.909 5553-9554/com.example.demo I/clp: methodA05-09 08:48:13.909 5553-9556/com.example.demo I/clp: methodA05-09 08:48:13.909 5553-9555/com.example.demo I/clp: methodA05-09 08:48:13.909 5553-9557/com.example.demo I/clp: methodA05-09 08:48:18.899 5553-9553/com.example.demo I/clp: method B end

methodB加锁,并不会影响methodA的执行。

给methodA方法也加上锁。

public class CldSyncUtil {    public static synchronized void methodA() {//加锁        Log.i("clp", "methodA");    }    public static synchronized void methodB() {//加锁        Log.i("clp", "method B start");        try {            Thread.sleep(5000);        } catch (Exception e) {            e.printStackTrace();        }        Log.i("clp", "method B end");    }}
05-09 08:49:14.389 10801-10870/com.example.demo I/clp: method B start05-09 08:49:19.389 10801-10870/com.example.demo I/clp: method B end05-09 08:49:19.389 10801-10871/com.example.demo I/clp: methodA05-09 08:49:19.389 10801-10873/com.example.demo I/clp: methodA05-09 08:49:19.389 10801-10874/com.example.demo I/clp: methodA05-09 08:49:19.389 10801-10872/com.example.demo I/clp: methodA

后面的线程会等到第一个线程执行完,才能执行。

同步的时候访问同一个变量

同步的意思是多个线程之间不能同时访问同步块中的代码,但是里面引用的变量等还是可以访问的。

public class CldSyncUtil {    public static int num = 0;    public static void methodA() {//都不加锁        Log.i("clp", "methodA=" + num);    }    public static synchronized void methodB() {//都不加锁        Log.i("clp", "method B start");        num++;        try {            Thread.sleep(5000);        } catch (Exception e) {            e.printStackTrace();        }        Log.i("clp", "method B end");    }}
        for (int i = 0; i < 5; i++) {            final int index = i;            new Thread(new Runnable() {                @Override                public void run() {                    if (index == 0) {//第一个线程执行methodB,其他的线程执行methodA                        CldSyncUtil.methodB();                    } else {                        CldSyncUtil.methodA();                    }                    try {                        Thread.sleep(200);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }).start();        }
05-09 09:01:36.049 24673-24728/com.example.demo I/clp: method B start05-09 09:01:36.049 24673-24731/com.example.demo I/clp: methodA=105-09 09:01:36.059 24673-24730/com.example.demo I/clp: methodA=105-09 09:01:36.059 24673-24732/com.example.demo I/clp: methodA=105-09 09:01:41.049 24673-24728/com.example.demo I/clp: method B end05-09 09:01:41.049 24673-24729/com.example.demo I/clp: methodA=1

RE:在执行method B的时候,可以同时访问method A中使用的变量num

0 0
原创粉丝点击