线程同步控制的几种方式

在多线程对同一个函数进行调用时,如果不控制号锁的机制,往往就会产生数据混乱的情况,我们通常在控制线程的同步问题时,通常采用的方法:

1:使用synchronized进行控制访问。

2:使用ReentrantLock,进行上锁,方法体结束时进行解锁,因此得到控制。

下面我分别通过一个实例,来详细说明一下,上锁的方法,如果去掉锁机制之后,你会发现数据会出现混乱的情况。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TraditionalThreadSynchronized {
       public static void main(String[] args) {
		   TraditionalThreadSynchronized tt = new TraditionalThreadSynchronized();
		   tt.init();
	}

       public void init(){
    	   final Outeputer out = new Outeputer();
            new Thread(new Runnable() {
				@Override
				public void run() {
					while(true){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					out.output2("robin222222222222222");
				}}
			}).start();

            new Thread(new Runnable() {

				@Override
				public void run() {
					while(true){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					out.output2("Tcent111111111");
				}}
			}).start();
       }
       static class Outeputer{
    	   Lock lock = new ReentrantLock();
    	   public void output(String name){
    		   synchronized (Outeputer.class) {
    			   int len = name.length();
        		   for(int i=0;i<len;i++){
        			   System.out.print(name.charAt(i));
        		   }
        		   System.out.println();
			}

    	   }
    	   public  void  output2(String name){
    		     //lock.lock();//这里自行进行测试
    			   int len = name.length();
        		   for(int i=0;i<len;i++){
        			   System.out.print(name.charAt(i));
        		   }
        		   System.out.println();
    		 // lock.unlock();
    	   }
    	   public void  output3(String name){
			   int len = name.length();
    		   for(int i=0;i<len;i++){
    			   System.out.print(name.charAt(i));
    		   }
    		   System.out.println();

	   }
       }
}
时间: 2024-10-13 14:18:06

线程同步控制的几种方式的相关文章

IOS 多线程,线程同步的三种方式

一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IOS中我们一般情况下使用以下三种线程同步代码方式: 第一种和第二种代码同步的使用方法,一般情况下我们只需要使用NSLock和NSCondition申明2个属性.然后给此属性赋对应的值.那么即可作为安全防控的线程手段. 同时也可以保证线程的资源安全. 1:NSLock方式 [xxxlock   lock] //上锁 同步代码块 [xxxlock   unlock]//解锁 2:NSCondition

iOS中保证线程安全的几种方式与性能对比

来源:景铭巴巴 链接:http://www.jianshu.com/p/938d68ed832c 一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized.NSLock.dispatch_semaphore.NSCondition.pthread_mutex.OSSpinLock.后来网上查了一下,发现他们的实现机制各不相同,性能也各不一样.不好意思,我们平常使用最多的@synchronized是性能最差的.下面我们先分别介绍每个加锁方式的使用,在使用

Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载

 在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是通过AsyncTask来实现,另一种方式则是通过ThreadPool来实现,今天我们就通过一个例子来讲解和对比这两种实现方式.     项目的结构如下所示:     在今天这个例子里,我们用到了之前一篇文章中写过的一个自定义控件,如果有同学感兴趣的话可以点击这里来先研究下这个控件的实现,为了配合异

关于线程开启的两种方式

第一种方式,继承Thread类 1 public class Thread extends java.lang.Thread { 2 3 private String name; 4 5 // 定义run方法 6 public void run() { 7 for (int i = 0; i < 20; i++) { 8 System.out.println(name + "haha"); 9 } 10 } 11 12 // 构造函数重写构(无参) 13 public Threa

线程的几个主要概念----线程间通信;线程死锁;线程控制:挂起、停止和恢复(线程同步的5种方式)

(一)线程同步(5种同步方式) 1.同步方法--->有synchronized关键字修饰的方法.(Java的每个内置对象都有一个内置锁,当用synchronized修饰方法--->内置锁保护整个方法) 在调用该方法前,需要获得内置锁,否则就处于阻塞状态. eg: public  synchronized  void  save(){     } [注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类.] 2.同步代码块:--->有synchron

java线程实现的四种方式

java多线程的实现可以通过以下四种方式 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法 3.通过Callable和FutureTask创建线程 4.通过线程池创建线程 方式1,2不再赘述. 方式3,通过Callable和FutureTask创建线程实现多线程 @Test public void MyCallableTest() throws Exception { //创建线程执行对象 MyCallable myCallable = new MyCalla

C++实现线程同步的几种方式

线程同步是指同一进程中的多个线程互相协调工作从而达到一致性.之所以需要线程同步,是因为多个线程同时对一个数据对象进行修改操作时,可能会对数据造成破坏,下面是多个线程同时修改同一数据造成破坏的例子: 1 #include <thread> 2 #include <iostream> 3 4 void Fun_1(unsigned int &counter); 5 void Fun_2(unsigned int &counter); 6 7 int main() 8 {

Java中创建线程用第几种方式

2015年11月19日10:16:33 作者:数据分析玩家 //用第一种方法创建线程:每个线程处理的是不同的资源//每个线程分别对应20张电影票,之间并无任何关系,这就说明每个线程之间是平等的,没有优先级关系class Tc extends Thread { private int tickets = 20;//每个线程各自卖20张票 public String name ; public Tc(String name) { this.name = name; } public void run

【线程实现的两种方式及区别】

我们来用最经典的卖票的案例,表明两种实现方式的区别,同时分析线程不安全产生的原因 一.继承Thread类 package test; /** * @Description * @Author shusheng * @Email [email protected] * @Date 2018/8/31 */ public class SellTicketOne extends Thread{ private static int tickets = 100; @Override public voi