多线程的同步问题

原创 2011年01月12日 16:06:00

多线程的同步依靠的是对象锁机制, synchronized 关键字的背后就是利用了封锁来实现对共享资源的互斥访问。 要想实现线程的同步,则这些线程必须去竞争一个唯一的共享的对象锁.


public void synchronized function(){} -> 这个锁的是function这个方法所在的对象, 相当于
     public void function() {
        synchronized(this ){}      
     }

public static void synchronized function() ->对于静态方法,锁定的是当前类(假设是类TestClass)的Class对象 ,相当于
     public static void function() {
         synchronized(TestClass.class ) {}
     }

 

 

 

实现同步1. synchronized ( obj ) , 当然是锁obj.在创建启动线程之前,先创建一个线程之间竞争使用的Object对象,然后将这个Object对象的引用传递给每一个线程对象的lock成员变量。这样一 来,每个线程的lock成员都指向同一个Object对象。我们在run方法中,对lock对象使用synchronzied块进行局部封锁 ,这样就可以 让线程去竞争这个唯一的共享的对象锁,从而实现同步。

class  MyThread  implements  java.lang.Runnable
{
    
private   int  threadId;
    
private static Object lock = new  Object();
    
public  MyThread( int  id)
    {
        
this .threadId  =  id;
    }
    @Override
    
public    void  run() 
    {
        
synchronized (lock)      // 共用一个对象锁lock
        {
            
for  ( int  i  =   0 ; i  <   100 ++ i)
            {
                System.out.println(
" Thread ID:  "   +   this .threadId  +   "  :  "   +  i);
            }
        }
    }
}
public   class  ThreadDemo 
{
    
/**
     * 
@param  args
     * 
@throws  InterruptedException 
     
*/
    
public   static   void  main(String[] args)  throws  InterruptedException
    {
        
for  ( int  i  =   0 ; i  <   10 ++ i)
        {
            
new  Thread( new  MyThread(i)).start();
            Thread.sleep(
1 );
        }
    }
}

 


 

再来看一段代码,实例方法中加入 sychronized 关键字封锁的是 this 对象本身 ,而在静态方法中加入 sychronized 关键字封锁的就是类本身 。静态方法是所有类实例对象所共享的,因此线程对象在访问此静态方法时是互斥访问的,从而可以实现线程的同步,代码如下所示:

代码 package  com.vista;

class  MyThread  implements  java.lang.Runnable
{
    
private   int  threadId;
    
    
public  MyThread( int  id)
    {
        
this .threadId  =  id;
    }
    @Override
    
public    void  run() 
    {
        taskHandler(
this .threadId);
    }
    
private  static synchronized  void  taskHandler( int  threadId)
    {
        
for  ( int  i  =   0 ; i  <   100 ++ i)
        {
            System.out.println(
" Thread ID:  "   +  threadId  +   "  :  "   +  i);
        }
    }
}
public   class  ThreadDemo
{
    
/**
     * 
@param  args
     * 
@throws  InterruptedException 
     
*/
    
public   static   void  main(String[] args)  throws  InterruptedException
    {
        
for  ( int  i  =   0 ; i  <   10 ++ i)
        {
            
new  Thread( new  MyThread(i)).start();
            Thread.sleep(
1 );
        }
    }
}

 

 


【Linux多线程】三个经典同步问题

在了解了《同步与互斥的区别 》之后,我们来看看几个经典的线程同步的例子。相信通过具体场景可以让我们学会分析和解决这类线程同步的问题,以便以后应用在实际的项目中。一、生产者-消费者问题问题描述:一组生产...

多线程中的lua同步问题

多线程中的lua同步问题 http://www.cnblogs.com/ghost240/p/3526185.html 最近写paintsnow::start时出现了一个非常麻...

java中多线程安全问题产生&解决方案——同步方法

使用同步方法解决  格式:   修饰符 synchronized 返回值 方法名(){   } package com.itheima_05; /* * 同步方法:使用关键...

Java多线程中同步Boolean问题

最近在使用netty写个小玩意儿,其中在通信时,Server给Client的响应中,要包含一组信息,直到Client成功收到并解析。 这需要有一个Flag,一开始我使用Boolean, 变量名rec...
  • yi_Afly
  • yi_Afly
  • 2015年12月27日 15:06
  • 1270

J2SE学习笔记:多线程、单例模式延迟加载懒汉式同步、死锁问题

package cn.itcast.threaddemo; /** * 开启新线程两种方式: * 1.继承Thread类。在主线程中new 一个Thread子类对象,调用start()。 * 2...

测试代码,解决java gui swing多线程界面假死、僵死问题,实现界面动态刷新,动态同步更新数据

(原创) 测试代码,解决java gui swing多线程界面假死、僵死问题,实现界面动态刷新,动态更新,同步显示数据 主类: package testguimulitiplethr...

java多线程解决同步问题的几种方式、原理和代码

在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。管道方法不建议使用,阻塞队列方法在问题4已有描述,现只提供前两种实现方法。 wait()/notify()方法await()...

黑马程序员:多线程的介绍、应用及由安全问题引出的同步代码块介绍

进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元 线程:进程中一个独立的控制单元,实质上是线程在控制着进程的执行,一个进程中至少有一个线程 JV...

代码解说多线程互斥与同步通信问题

参考 张孝详系列 场景 编写一个程序:子线程连说 3 次  “ 你愿意吗?” ,接着主线程连续回答 10次 “我愿意” ,然后子线程再说3次“你愿意吗?”,主  线程回答“我愿意” 10次 。。。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程的同步问题
举报原因:
原因补充:

(最多只允许输入30个字)