美文网首页
Synchronized

Synchronized

作者: 程序设计法师 | 来源:发表于2018-12-20 16:23 被阅读0次

synchronized提供了一种锁的机制,能够确保共享变量之间的互斥访问,从而防止数据不一致问题的出现

synchronized关键字包括monitor enter和monitor exit两个jvm指令,他们是成对出现的,他能够保证在任何时候任何线程执行到monitor enter成功之前都必须从主内存中获取数据,而不是从缓存中,在monitor exit运行成功之后,共享变量被更新后的值必须刷入主内存。

synchronized ,一个monitor exit 指令之前必定要有一个monitor enter
他的实现有多种方式:

第一种:同步方法

public class SyncClass implements Runnable{
    private int index=1;
    @Override
    public synchronized void run() {
        System.out.println(Thread.currentThread()+"的号码是:"+index++);
    }
}

第二种:同步代码块

public class SyncClass implements Runnable{
    private  Object MUTEX=new Object();
    private int index=1;
    @Override
    public void run() {
        synchronized (MUTEX){
                System.out.println(Thread.currentThread()+"的号码是:"+index++);
        }
    }
}
public class SyncClass implements Runnable{
    private int index=1;
    @Override
    public void run() {
        synchronized (this){
                System.out.println(Thread.currentThread()+"的号码是:"+index++);
        }
    }
}
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SyncClass runnable=new SyncClass();
        Thread thread1=new Thread(runnable,"一号");
        Thread thread2=new Thread(runnable,"二号");
        Thread thread3=new Thread(runnable,"三号");
        Thread thread4=new Thread(runnable,"四号");
        Thread thread5=new Thread(runnable,"五号");
        Thread thread6=new Thread(runnable,"六号");
        Thread thread7=new Thread(runnable,"七号");
        Thread thread8=new Thread(runnable,"八号");
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();
        thread6.start();
        thread7.start();
        thread8.start();
    }
}

打印结果如下:

12-20 15:48:10.617 3914-3938/e.lenovo.textapplication I/System.out: Thread[六号,5,main]的号码是:1
12-20 15:48:10.617 3914-3939/e.lenovo.textapplication I/System.out: Thread[七号,5,main]的号码是:2
12-20 15:48:10.618 3914-3937/e.lenovo.textapplication I/System.out: Thread[五号,5,main]的号码是:3
12-20 15:48:10.618 3914-3936/e.lenovo.textapplication I/System.out: Thread[四号,5,main]的号码是:4
12-20 15:48:10.618 3914-3935/e.lenovo.textapplication I/System.out: Thread[三号,5,main]的号码是:5
12-20 15:48:10.620 3914-3934/e.lenovo.textapplication I/System.out: Thread[二号,5,main]的号码是:6
12-20 15:48:10.620 3914-3933/e.lenovo.textapplication I/System.out: Thread[一号,5,main]的号码是:7
12-20 15:48:10.621 3914-3940/e.lenovo.textapplication I/System.out: Thread[八号,5,main]的号码是:8

相关文章

网友评论

      本文标题:Synchronized

      本文链接:https://www.haomeiwen.com/subject/iooykqtx.html