首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java锁(同步)全局变量

Java锁(同步)全局变量
EN

Stack Overflow用户
提问于 2015-09-01 10:07:14
回答 5查看 3.3K关注 0票数 0

我有一个代码

代码语言:javascript
复制
public class Exec {

    private String string = "";

    public void start() {
        MyThread t = new MyThread();
        MyThread2 t2 = new MyThread2();
        t.start();
        t2.start();
    }

    private class MyThread extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {

                string = "1";

                System.out.println(string);
                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private class MyThread2 extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {

                string = "2";

                System.out.println(string);
                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

没什么难的。2线程打印一个值。

产出:

代码语言:javascript
复制
1
2
1
2
1
...

如何锁定全局变量(资源)的问题?产出:

代码语言:javascript
复制
1
1
1
1
...
2
2
2
2
...
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-09-01 10:11:23

简单的解决方案是将start()更改为run(),因为您实际上不需要多个线程。

但是,您可以使用这个

代码语言:javascript
复制
synchronized(Exec.class) {

代码语言:javascript
复制
synchronized(System.out) {

作为一个共享的全局对象,或者可以传递这样的对象。

票数 1
EN

Stack Overflow用户

发布于 2015-09-01 10:10:24

在启动第二个线程之前(或者在启动它之后,但在进入for循环之前),您可以调用t.join(),直到t完成为止。

票数 1
EN

Stack Overflow用户

发布于 2015-09-01 10:11:54

只需创建一个锁变量并锁定该变量。

代码语言:javascript
复制
public class Exec {

    private String string = "";
    private Object globalLock = new Object();  // The global lock  

    public void start() {
        MyThread t = new MyThread(globalLock);
        MyThread2 t2 = new MyThread2(globalLock);
        t.start();
        t2.start();
    }

    private class MyThread extends Thread {
        private Object lock;

        public MyThread(Object lock) {
            this.lock = lock;
        }

        @Override
        public void run() {
            synchronized(lock) {
                for (int i = 0; i < 10; i++) {
                    string = "1";
                    System.out.println(string);
                    try {
                        sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    private class MyThread2 extends Thread {
        private Object lock;

        public MyThread2(Object lock) {
            this.lock = lock;
        }

        @Override
        public void run() {
            synchronized(lock) {
                for (int i = 0; i < 10; i++) {
                    string = "2";
                    System.out.println(string);
                    try {
                        sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32328881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档