首页 > 代码库 > Java 多线程序的一点理解
Java 多线程序的一点理解
synchronized 是java 内主要的同步标记
1 同步非静态方法
作用域范围只是当前对象在不同线程间的同步, 如果n 为Test外的对象,在不同的Test对象之间,等于没有同步, 该方法只能同步n为Test类内对象
public class Test public synchronized void inc() { n++; }}
如果想同步类外的n,使用同步代码块对象,对象也为一个类外对象,相对所有Test对象来说, 也只有一个,所以就能同步
final Integer lock = new Integer(1); class Test implements Runnable { public int value = http://www.mamicode.com/0;>
2 同步静态方法
public class Test public static synchronized void inc() { n++; }}
作用域范围是所有Test类对象, inc方法在所有Test对象之间只能被一个同时调用
3 同步代码块
publci class Test{ public void inc() { synchronized (lock) { // m++; value++; n++; } }}
作用域范围,取决于lock的相对该类的作用域范围
如果lock 是该类以外的对象,相对所有的Test 对象而言, lock是个全局变量, synchronized同步范围在所有对象之间
如果lock 是该类以内的对象,如类内变量,相对所有的Test 对象而言, lock是个本地局部变量, synchronized同步范围在同一对象的不同线程之间, 和同步非静态方法一样
测试代码
import java.util.concurrent.CountDownLatch;import java.util.concurrent.CountDownLatch;public class TestVolatile { public static volatile int n = 0; // public Integer m = 0; final Integer lock = new Integer(1); class MyThread implements Runnable { public int value = http://www.mamicode.com/0;"test1"); } for (int i = 0; i < threadary.length; i++) { threadary[i].start(); } for (int i = 0; i < threadary.length; i++) { threadary[i].join(); // System.out.println((mythreadary[i]).value); } System.out.println(TestVolatile.n); System.out.println(m); System.out.println("程序耗时: " + (System.currentTimeMillis() - beg)); } public static void main(String[] args) throws InterruptedException { TestVolatile tmp = new TestVolatile(); tmp.runthread(); }}
Java 多线程序的一点理解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。