Java线程同步

package a.thread;

public class A {
    private static int x = 0;

    public void run() {
        // 同步代码块
        synchronized (this) {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName()
                        + "=====;x=" + x);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                x++;
            }
        }
    }

    // 同步方法
    public synchronized void aa() {
        for (int i = 0; i < 10; i++) {
            System.out
                    .println(Thread.currentThread().getName() + "====;x=" + x);
            x++;
        }
    }
}
View Code
package a.thread;

public class MainB {
    public static void main(String[] args) {
        final A a1 = new A();
        Thread[] threads = new Thread[5];
        for (int i = 0; i < 5; i++) {
            threads[i] = new Thread(new Runnable() {

                public void run() {
                    a1.aa();
                    a1.run();
                }
            });
            threads[i].setName("线程" + i);
            threads[i].start();
            try {
                threads[i].sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int i = 0; i < 5; i++) {
            try {
                threads[i].join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
View Code

 同步方法---使用synchronized修饰的方法:

访问修饰符  synchronized [static] 数据返回类型 方法名() {

...........

}

防止多个线程同时访问这个类中的synchronized static 方法。static可以省略,它可以对类的所有对象实例起作用。

同步语句块---只对这个区块的资源实行互斥访问:

synchronized(共享对象名){

  被同步的代码段

}

1)它锁定的是共享对象名对应的当前对象。

2)线程中实现同步块一般是在run方法中添加。

原文地址:https://www.cnblogs.com/LYL-1314/p/5728332.html