多线程日记(17.5.2two)synchronized的基本规则

synchronized关键字

1)当有一条线程访问某个对象的synchronized的方法或代码块时,其它线程进行访问将会被阻塞;

2)当有一条线程访问某个对象的synchronized的方法或代码块时,其它线程访问该对象的非同步代码块时不会被阻塞;

3)当有一条线程访问某个对象的synchronized的方法或代码块时,其它线程访问该对象的其它同步代码块时将会被阻塞。

第一条规则

public class Test {
    public static void main(String[]args){
        //create object for the two threads
        NewThread obj=new NewThread();
        //create new thread
        Thread thread1=new Thread(obj,"t1");
        Thread thread2=new Thread(obj,"t2");
        thread1.start();
        thread2.start();
    }
}
class NewThread implements Runnable{
    @Override
    public void run(){
        synchronized(this){
            try{
                for(int i=0;i<3;i++){
                    Thread.sleep(100);
                    System.out.println(Thread.currentThread().getName()+":"+(i+1));
                }
            }catch(InterruptedException e){
                System.out.println("error");
            }
        }
    }

}

第二条规则:

public class Test {
    public static void main(String[]args){
        final Demo demo=new Demo();
        //create first thread
        Thread thread1=new Thread(new Runnable(){
            @Override
            public void run(){
                demo.synchronizedThread();
            }
        },"t1");
        //create second thread
        Thread thread2=new Thread(new Runnable(){
            @Override
            public void run(){
                demo.unsynchronizedThread();
            }
        },"t2");
        thread1.start();
        thread2.start();
    }
}
class Demo{
    //synchronized method
    public void synchronizedThread(){
        synchronized(this){
            try{
                for(int i=0;i<3;i++){
                    System.out.println(Thread.currentThread().getName()+":"+(i+1));
                    Thread.sleep(100);
                }
            }catch(InterruptedException e){
                System.out.println("error");
            }
        }
    }
    //unsynchronized method
    public void unsynchronizedThread(){
        try{
            for(int i=0;i<3;i++){
                System.out.println(Thread.currentThread().getName()+":"+(i+1));
                Thread.sleep(100);
            }
        }catch(InterruptedException e){
            System.out.println("error");
        }

    }
}

第三条规则:

public class Test {
    public static void main(String[]args){
        final Demo demo=new Demo();
        //create first thread
        Thread thread1=new Thread(new Runnable(){
            @Override
            public void run(){
                demo.synchronizedThread();
            }
        },"t1");
        //create second thread
        Thread thread2=new Thread(new Runnable(){
            @Override
            public void run(){
                demo.samesynchronizedThread();
            }
        },"t2");
        thread1.start();
        thread2.start();
    }
}
class Demo{
    //synchronized method
    public void synchronizedThread(){
        synchronized(this){
            try{
                for(int i=0;i<3;i++){
                    System.out.println(Thread.currentThread().getName()+":"+(i+1));
                    //sleep(100)
                    Thread.sleep(100);
                }
            }catch(InterruptedException e){
                System.out.println("error");
            }
        }
    }
    //synchronized method
    public void samesynchronizedThread(){
        synchronized(this){
            try{
                for(int i=0;i<3;i++){
                    System.out.println(Thread.currentThread().getName()+":"+(i+1));
                    //sleep(100)
                    Thread.sleep(100);
                }
            }catch(InterruptedException e){
                System.out.println("error");
            }
        }
    }
}

synchronized的方法和代码块

方法:public synchronized void method1(){}

代码块:class Lei{synchronized(this)}

参考自:http://www.cnblogs.com/skywang12345/p/3479202.html#p3

时间: 2024-10-06 12:20:42

多线程日记(17.5.2two)synchronized的基本规则的相关文章

多线程日记(17.5.4)

1.线程的等待与唤醒wait()和notify(): public class Test{ public static void main(String[]args){ Thread thread1=new NewThread("t1"); synchronized(thread1){ System.out.println(Thread.currentThread().getName()+" is running"); thread1.start(); System

多线程读写共享变量时,synchronized与volatile的作用

在<effective java>中看的的知识点,在工作中确实遇到了~ 关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块. 同步并不是单单指线程之间的互斥.如果没有同步,一个线程的变化就不能被其他线程看到.同步不仅可以阻止一个线程看到对象处于不一致的状态之中, 它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前的所有修改效果. 思考下面这个程序的运行过程是什么样的. <span style="font-

Java多线程:线程同步与关键字synchronized

一.同步的特性1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blog.csdn.net/huang_xw/article/details/73185613. 如果两个线程要执行一个类中的同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 参见实验2:http://blog.csdn.net/h

多线程同步互斥实例——使用synchronized实现线程通信和互斥

线程互斥概念 线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性.但互斥无法限制访问者对资源的访问顺序,即访问是无序的. 实现线程同步互斥的四种方式 临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用 互斥量 (Mutex):适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似. 事件(Event):通过线程间触发事件实现同步互斥 信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理

java的多线程安全,ReentrantLock与synchronized锁

前言 多线程总的来说是一个很大的模块,所以虽然之前就想写但一直感觉有地方没有理解透,在经过了一段时间学习后,终于有点感觉了,在此写下随笔. 多线程安全问题##: 首先和大家讨论一下多线程为什么会不安全,大家先看下面的程序. /** - @author lw */ public class Test extends Thread{ public void run() { for(int i=1;i<=10;i++) { System.out.println(i); } } public stati

【java多线程】(3)---synchronized、Lock

synchronized.Lock 一.概述 1.出现线程不安全的原因是什么? 如果我们创建的多个线程,存在着共享数据,那么就有可能出现线程的安全问题:当其中一个线程操作共享数据时,还未操作完成,另外的线程就参与进来,导致对共享数据的操作出现问题. 2.线程不安全解决办法 要求一个线程操作共享数据时,只有当其完成操作完成共享数据,其它线程才有机会执行共享数据.java提供了两种方式来实现同步互斥访问:synchronized和Lock. 二.synchronized synchronized可以

小白日记17:kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail

缓冲区溢出实例 缓冲区溢出原理:http://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html 空间存储了用户程序的函数栈帧(包括参数.局部数据等),实现函数调用机制,它的数据增长方向是低地址方向.堆空间存储了程序运行时动态申请的内存数据等,数据增长方向是高地址方向.除了代码段和受操作系统保护的数据区域,其他的内存区域都可能作为缓冲区,因此缓冲区溢出的位置可能在数据段,也可能在堆.栈段.如果程序的代码有软件漏洞,恶意程序

Java多线程之可见性与原子性——synchronized VS volatile

程序举例: 代码: package com.synch; public class SynchronizedDemo { //共享变量 private boolean ready = false; private int result = 0; private int number = 1; //写操作 public synchronized void write(){ ready = true; number = 2; } //读操作 public synchronized void read

java多线程、并发系列之 (synchronized)同步与加锁机制

Synchronized Java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁.获得一个对象的锁也称为获取锁.锁定对象.在对象上锁定或在对象上同步. 当程序运行到synchronized同步方法或代码块时才该对象锁才起作用. 一个对象只有一个锁.所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁.这也意味着任何其他线程都不能进入该对象上的synchronized方法