<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title> &#187; sync Mutex</title>
	<atom:link href="http://www.liguosong.com/tag/sync-mutex/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.liguosong.com</link>
	<description></description>
	<lastBuildDate>Tue, 08 May 2018 01:02:19 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.2</generator>
		<item>
		<title>golang sync mutex</title>
		<link>http://www.liguosong.com/2014/05/07/golang-sync-mutex/</link>
		<comments>http://www.liguosong.com/2014/05/07/golang-sync-mutex/#comments</comments>
		<pubDate>Wed, 07 May 2014 05:43:54 +0000</pubDate>
		<dc:creator>lgs</dc:creator>
				<category><![CDATA[golang]]></category>
		<category><![CDATA[sync Mutex]]></category>

		<guid isPermaLink="false">http://www.liguosong.com/?p=281</guid>
		<description><![CDATA[golang的多线程固然好用，但是有时候需要对数据进行上锁，防止数据被其它线程更改。那么sync包下的Mute [...]]]></description>
				<content:encoded><![CDATA[<p>golang的多线程固然好用，但是有时候需要对数据进行上锁，防止数据被其它线程更改。那么sync包下的Mutex非常好用。</p>
<p>Mutex是一个互斥锁。可以作为struct的一部分，这样这个struct就会防止被多线程更改数据。<br />
<span id="more-281"></span><br />
来个例子：</p>
<pre class="brush:c">package main

import (
	"fmt"
	"sync"
	"time"
)

type User struct {
	Name   string
	Locker *sync.Mutex
}

func (u *User) SetName(wati *sync.WaitGroup, name string) {
	defer func() {
		fmt.Println("Unlock set name:", name)
		u.Locker.Unlock()
		wati.Done()
	}()

	u.Locker.Lock()
	fmt.Println("Lock set name:", name)
	time.Sleep(1 * time.Second)
	u.Name = name
}

func (u *User) GetName(wati *sync.WaitGroup) {
	defer func() {
		fmt.Println("Unlock get name:", u.Name)
		u.Locker.Unlock()
		wati.Done()
	}()

	u.Locker.Lock()
	fmt.Println("Lock get name:", u.Name)
	time.Sleep(1 * time.Second)
}

func main() {
	user := User{}
	user.Locker = new(sync.Mutex)
	wait := &amp;sync.WaitGroup{}
	names := []string{"a", "b", "c"}
	for _, name := range names {
		wait.Add(2)
		go user.SetName(wait, name)
		go user.GetName(wait)
	}

	wait.Wait()
}</pre>
<p>输出结果：</p>
<pre class="brush:c">Lock set name: a
Unlock set name: a
Lock get name: a
Unlock get name: a
Lock set name: b
Unlock set name: b
Lock get name: b
Unlock get name: b
Lock set name: c
Unlock set name: c
Lock get name: c
Unlock get name: c</pre>
<p>程序很简单，就是防止在读取姓名的时候，被其它线程更改。这个程序还有些问题，不过总得来说，就是想演示一下Mutex的用途。可以让一个struct只被一个线程操作，而其它的线程就会阻塞。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liguosong.com/2014/05/07/golang-sync-mutex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
