线程的基本操作-完

Posted zkfly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程的基本操作-完相关的知识,希望对你有一定的参考价值。

线程安全是多线程开发的根基, 我们能够使用volatile保证变量更新的数据其他线程能够看到, 但是如果两个线程同时操作一个数据, 线程安全无法保证.

下面的例子中, i的结果大概率小于我们预期的200000, 原因就在于T1,T2同时获取i值, 先后写入同一个结果.

public class Sync implements Runnable 
	private static Sync sync = new Sync();

	public volatile static int i = 1;

	public static void instance() 
		i++;
	

	@Override
	public void run() 
		for (int i = 0; i < 100000; i++) 
			instance();
		
	

	public static void main(String[] args) throws InterruptedException 
		Thread t1 = new Thread(sync);
		Thread t2 = new Thread(sync);
		t1.start();
		t2.start();
		t1.join();
		t2.join();
		System.out.println(i);
	

为保证线程的安全, 我们使用synchronized关键字去实现线程的同步, 通过对同步的代码(i++)加锁来保证安全.

  1. 指定加锁对象 : 给指定对象加锁
  2. 直接作用于实例方法 : 相当于对当前实例加锁
  3. 直接作用于静态方法: 相当于对当前类加锁
private static Sync sync = new Sync();

	public volatile static int i = 1;

	public static void instance() 
		i++;
	

	@Override
	public void run() 
		for (int j = 0; j < 100000; j++) 
                       //指定加锁对象
			synchronized (sync) 
				i++;
			
		
	

  

private static Sync sync = new Sync();

	public volatile static int i = 1;
        //去掉static就是, 给实例方法加锁(执行代码的2线程指向同一个runnable才会有效)
	public static synchronized void instance() 
		i++;
	

	@Override
	public void run() 
		for (int i = 0; i < 100000; i++) 
			instance();
		
	

  

以上是关于线程的基本操作-完的主要内容,如果未能解决你的问题,请参考以下文章

进程与线程对比/进程与线程的区别

一个故事讲完进程线程和协程(操作系统基础知识)

用QT是怎么编写后台线程,我开启了一个耗时的线程,结果界面就卡住,只有等到这个线程执行完才会做其他。

Java多线程之线程同步

进程线程对比

iOS AFNetWorking中block执行完后再执行其它操作