欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java-Synchronized 一种同步锁的使用

程序员文章站 2022-09-20 12:14:02
java-Synchronized 一种同步锁:package com.company;import java.util.Vector;/** * synchronized 是一种同步锁 * * 修饰一个代码块 * 1、一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞。 */public class SynchronizedThread extends Thread { public static int count...

java-Synchronized 一种同步锁:

package com.company;

import java.util.Vector;

/**
 * synchronized 是一种同步锁
 *
 * 修饰一个代码块
 * 1、一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞。
 */
public class SynchronizedThread extends Thread {

    public static int count = 0;

    public synchronized void run(){
        for (int i = 0; i < 5; i++) {
            try {
                System.out.println("线程名:" + Thread.currentThread().getName()+ " :" + (count++));
//                Thread.sleep(100);
            }catch (Exception  e){
                e.printStackTrace();
            }
        }
    }
}

package com.company;

/**
 *  Synchronzie  关键之的使用
 */
public class SynchronizedMain {
    public static void main(String[] args) {

        /**
         * 当两个并发线程(thread1和thread2)访问同一个对象(synchronize)中的synchronized代码块时,
         * 在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块
         * 以后才能执行该代码块。Thread1和thread2是互斥的,因为在执行synchronize 代码块时会锁定当前
         * 的对象,只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。
         */

        Thread thread1 = new Thread(new SynchronizedThread(), "t1");
        Thread thread2 = new Thread(new SynchronizedThread(), "t2");
        thread1.start();
        thread2.start();

        /**
         * thread1和thread2同时在执行。这是因为synchronized只锁定对象,每个对象只有一个锁(lock)与之相关联;
         * 这时创建了两个 这时创建了两个SyncThread的对象syncThread1和syncThread2,
         * 线程thread1 执行的是syncThread1 对象中的synchronized代码(run)
         * 线程thread2 执行的是syncThread2 对象中的synchronized代码(run)
         *
         * 我们知道synchronized锁定的是对象,这时会有两把锁分别锁定syncThread1对象和syncThread2对象,
         * 而这两把锁是互不干扰的,不形成互斥,所以两个线程可以同时执行。
         */
//        SynchronizedThread synchronize1 = new SynchronizedThread();
//        SynchronizedThread synchronize2 = new SynchronizedThread();
//        Thread thread1 = new Thread(synchronize1, "synchronize1");
//        Thread thread2 = new Thread(synchronize2, "synchronize2");
//        thread1.start();
//        thread2.start();
    }
}

本文地址:https://blog.csdn.net/qq_43617838/article/details/110220862