博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程同步synchronized,Class与Object
阅读量:5243 次
发布时间:2019-06-14

本文共 2123 字,大约阅读时间需要 7 分钟。

synchronized (class):class类的同步,同步的时候会同步整个class

synchronized (Object):Object的同步,只对其中的对象同步

如下:对类B中的同步代码块的同步,对比之后放可明白

synchronized (MyThread.class)

例:

A:类UnsafeSequence

public class UnsafeSequence {

    private static int value;
    
    public int getValue()
    {
        synchronized (UnsafeSequence.class) {
            return value++;
        }
    }
    
    public int getValueA()
    {
        synchronized (this) {
            return value++;
        }
    }
}

B:类MyThread

public class MyThread implements Runnable {

    private UnsafeSequence unsafe;
    private static int value;
    
    @Override
    public void run() {
        unsafe = new UnsafeSequence();
        for(int i = 0; i < 60; i++)
        {
            synchronized (MyThread.class) {
                System.out.println(Thread.currentThread().getName() + "----in:");
                System.out.println(Thread.currentThread().getName() + " thread run i = " + i + ";value = " + unsafe.getValue());
                System.out.println(Thread.currentThread().getName() + "----out:" + value++);
            }
        }
    }
}

C:主函数

public class TestMain {

    public static void main(String[] args) {
        MyThread target_1 = new MyThread();
        MyThread target_2 = new MyThread();
        Thread thread_1 = new Thread(target_1, "A");
        Thread thread_2 = new Thread(target_2, "B");
        thread_1.start();
        thread_2.start();
    }
}

 

结果如下:

B----in:

B thread run i = 0;value = 0
B----out:0
B----in:
B thread run i = 1;value = 1
B----out:1
B----in:
B thread run i = 2;value = 2
B----out:2

 

去掉B中的同步,或换为Object,结果如下:

A----in:

B----in:
A thread run i = 0;value = 0
B thread run i = 0;value = 1
A----out:0
B----out:1
A----in:
B----in:
A thread run i = 1;value = 2
B thread run i = 1;value = 3
B----out:3
B----in:
A----out:2

 

控制同步:

public class MyThread implements Runnable {

    private UnsafeSequence unsafe;
    private static int value;
    
    @Override
    public void run() {
        synchronized (MyThread.class) {
            unsafe = new UnsafeSequence();
            for(int i = 0; i < 60; i++)
            {
                System.out.println(Thread.currentThread().getName() + "----in:");
                System.out.println(Thread.currentThread().getName() + " thread run i = " + i + ";value = " + unsafe.getValue());
                System.out.println(Thread.currentThread().getName() + "----out:" + value++);
            }
        }
    }
}

 

posted on
2016-03-07 23:38 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lvzhanhui/p/lvzhanhui.html

你可能感兴趣的文章
python学习笔记(2)--基本语法元素
查看>>
c++判断android是否含有某个进程
查看>>
学习 Docker - 入门
查看>>
window.location.href ie 不兼容问题
查看>>
每天CookBook之Python-102
查看>>
单例的五种实现方式,及其性能分析。
查看>>
个人工作总结09
查看>>
JavaScript中定义函数的几种方式
查看>>
学生成绩管理系统/学生信息管理系统
查看>>
.NET 使用 Office Open XML SDK2.5
查看>>
ssh配置文件简介
查看>>
为了写中秋这篇文章,我学了 20 种编程语言!
查看>>
docker基本操作
查看>>
kora 简单使用实现Api接口 以及mongodb简单使用
查看>>
WampServer中MySQL中文乱码解决
查看>>
tab栏切换
查看>>
HTML标签
查看>>
20130617—认识异常
查看>>
JAVA提高十一:LinkedList深入分析
查看>>
MPC&MAGIC
查看>>