Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
御承扬
java1
提交
268080e9
J
java1
项目概览
御承扬
/
java1
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
java1
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
268080e9
编写于
7月 18, 2019
作者:
御
御承扬
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update
上级
805f753e
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
263 addition
and
85 deletion
+263
-85
.idea/inspectionProfiles/Project_Default.xml
.idea/inspectionProfiles/Project_Default.xml
+6
-0
.idea/workspace.xml
.idea/workspace.xml
+93
-75
src/多线程/SynchronizedTest.java
src/多线程/SynchronizedTest.java
+49
-0
src/多线程/ThreadSafeTest.java
src/多线程/ThreadSafeTest.java
+8
-8
笔记/多线程.md
笔记/多线程.md
+107
-2
未找到文件。
.idea/inspectionProfiles/Project_Default.xml
浏览文件 @
268080e9
...
...
@@ -82,6 +82,12 @@
<option
name=
"CHECK_DUPLICATE_KEYS"
value=
"true"
/>
<option
name=
"CHECK_DUPLICATE_KEYS_WITH_DIFFERENT_VALUES"
value=
"true"
/>
</inspection_tool>
<inspection_tool
class=
"Duplicates"
enabled=
"true"
level=
"WEAK WARNING"
enabled_by_default=
"true"
>
<Java>
<minSize>
57
</minSize>
<isEnabled>
true
</isEnabled>
</Java>
</inspection_tool>
<inspection_tool
class=
"EmptyDirectory"
enabled=
"true"
level=
"WARNING"
enabled_by_default=
"true"
/>
<inspection_tool
class=
"EmptyInitializer"
enabled=
"true"
level=
"WARNING"
enabled_by_default=
"true"
/>
<inspection_tool
class=
"EqualsAndHashcode"
enabled=
"true"
level=
"WARNING"
enabled_by_default=
"true"
/>
...
...
.idea/workspace.xml
浏览文件 @
268080e9
...
...
@@ -2,13 +2,10 @@
<project
version=
"4"
>
<component
name=
"ChangeListManager"
>
<list
default=
"true"
id=
"4e65795a-6659-4829-a5e6-120206826e71"
name=
"Default Changelist"
comment=
""
>
<change
afterPath=
"$PROJECT_DIR$/.idea/markdown-navigator.xml"
afterDir=
"false"
/>
<change
afterPath=
"$PROJECT_DIR$/.idea/markdown-navigator/profiles_settings.xml"
afterDir=
"false"
/>
<change
afterPath=
"$PROJECT_DIR$/src/多线程/InterruptedSwing.java"
afterDir=
"false"
/>
<change
afterPath=
"$PROJECT_DIR$/src/多线程/Priority.java"
afterDir=
"false"
/>
<change
afterPath=
"$PROJECT_DIR$/src/多线程/PriorityTest.java"
afterDir=
"false"
/>
<change
afterPath=
"$PROJECT_DIR$/src/多线程/SynchronizedTest.java"
afterDir=
"false"
/>
<change
beforePath=
"$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml"
beforeDir=
"false"
afterPath=
"$PROJECT_DIR$/.idea/inspectionProfiles/Project_Default.xml"
afterDir=
"false"
/>
<change
beforePath=
"$PROJECT_DIR$/.idea/workspace.xml"
beforeDir=
"false"
afterPath=
"$PROJECT_DIR$/.idea/workspace.xml"
afterDir=
"false"
/>
<change
beforePath=
"$PROJECT_DIR$/src/多线程/ThreadSafeTest.java"
beforeDir=
"false"
afterPath=
"$PROJECT_DIR$/src/多线程/ThreadSafeTest.java"
afterDir=
"false"
/>
<change
beforePath=
"$PROJECT_DIR$/笔记/多线程.md"
beforeDir=
"false"
afterPath=
"$PROJECT_DIR$/笔记/多线程.md"
afterDir=
"false"
/>
</list>
<ignored
path=
"$PROJECT_DIR$/out/"
/>
...
...
@@ -40,12 +37,12 @@
</component>
<component
name=
"FileEditorManager"
>
<leaf
SIDE_TABS_SIZE_LIMIT_KEY=
"375"
>
<file
pinned=
"false"
current-in-tab=
"
tru
e"
>
<file
pinned=
"false"
current-in-tab=
"
fals
e"
>
<entry
file=
"file://$PROJECT_DIR$/笔记/多线程.md"
>
<provider
selected=
"true"
editor-type-id=
"split-provider[text-editor;MarkdownPreviewEditor]"
>
<state
split_layout=
"SPLIT"
>
<first_editor
relative-caret-position=
"
490
"
>
<caret
line=
"
460"
column=
"7"
lean-forward=
"true"
selection-start-line=
"460"
selection-start-column=
"7"
selection-end-line=
"460"
selection-end-column=
"
7"
/>
<first_editor
relative-caret-position=
"
515
"
>
<caret
line=
"
567"
selection-start-line=
"567"
selection-end-line=
"56
7"
/>
<folding>
<element
signature=
"e#1766#1767#0"
expanded=
"true"
/>
<element
signature=
"e#1806#1807#0"
expanded=
"true"
/>
...
...
@@ -66,24 +63,11 @@
</provider>
</entry>
</file>
<file
pinned=
"false"
current-in-tab=
"
fals
e"
>
<entry
file=
"file://$PROJECT_DIR$/src/多线程/
Priority
.java"
>
<file
pinned=
"false"
current-in-tab=
"
tru
e"
>
<entry
file=
"file://$PROJECT_DIR$/src/多线程/
SynchronizedTest
.java"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"304"
>
<caret
line=
"29"
column=
"1"
lean-forward=
"true"
selection-start-line=
"15"
selection-end-line=
"29"
selection-end-column=
"1"
/>
<folding>
<element
signature=
"e#539#540#0"
expanded=
"true"
/>
<element
signature=
"e#588#589#0"
expanded=
"true"
/>
</folding>
</state>
</provider>
</entry>
</file>
<file
pinned=
"false"
current-in-tab=
"false"
>
<entry
file=
"file://$PROJECT_DIR$/src/多线程/PriorityTest.java"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"600"
>
<caret
line=
"24"
column=
"1"
lean-forward=
"true"
selection-start-line=
"2"
selection-end-line=
"24"
selection-end-column=
"1"
/>
<caret
line=
"36"
column=
"44"
lean-forward=
"true"
selection-start-line=
"36"
selection-start-column=
"44"
selection-end-line=
"36"
selection-end-column=
"44"
/>
</state>
</provider>
</entry>
...
...
@@ -128,8 +112,6 @@
<component
name=
"IdeDocumentHistory"
>
<option
name=
"CHANGED_PATHS"
>
<list>
<option
value=
"$PROJECT_DIR$/src/Swing程序设计/JLabelTest.java"
/>
<option
value=
"$PROJECT_DIR$/src/测试代码专用/Try.java"
/>
<option
value=
"$PROJECT_DIR$/src/Swing程序设计/DrawIcon.java"
/>
<option
value=
"$PROJECT_DIR$/src/Swing程序设计/MyImageIcon.java"
/>
<option
value=
"$PROJECT_DIR$/src/Swing程序设计/JTextFieldTest.java"
/>
...
...
@@ -178,6 +160,8 @@
<option
value=
"$PROJECT_DIR$/src/多线程/InterruptedSwing.java"
/>
<option
value=
"$PROJECT_DIR$/src/多线程/Priority.java"
/>
<option
value=
"$PROJECT_DIR$/src/多线程/PriorityTest.java"
/>
<option
value=
"$PROJECT_DIR$/src/多线程/ThreadSafeTest.java"
/>
<option
value=
"$PROJECT_DIR$/src/多线程/SynchronizedTest.java"
/>
<option
value=
"$PROJECT_DIR$/笔记/多线程.md"
/>
</list>
</option>
...
...
@@ -206,7 +190,32 @@
<navigator
proportions=
""
version=
"1"
>
<foldersAlwaysOnTop
value=
"true"
/>
</navigator>
<panes
/>
<panes>
<pane
id=
"ProjectPane"
>
<subPane>
<expand>
<path>
<item
name=
"IDEA_JAVA"
type=
"b2602c69:ProjectViewProjectNode"
/>
<item
name=
"IDEA_JAVA"
type=
"462c0819:PsiDirectoryNode"
/>
</path>
<path>
<item
name=
"IDEA_JAVA"
type=
"b2602c69:ProjectViewProjectNode"
/>
<item
name=
"IDEA_JAVA"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"src"
type=
"462c0819:PsiDirectoryNode"
/>
</path>
<path>
<item
name=
"IDEA_JAVA"
type=
"b2602c69:ProjectViewProjectNode"
/>
<item
name=
"IDEA_JAVA"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"src"
type=
"462c0819:PsiDirectoryNode"
/>
<item
name=
"多线程"
type=
"462c0819:PsiDirectoryNode"
/>
</path>
</expand>
<select
/>
</subPane>
</pane>
<pane
id=
"Scope"
/>
<pane
id=
"PackagesPane"
/>
</panes>
</component>
<component
name=
"PropertiesComponent"
>
<property
name=
"ASKED_SHARE_PROJECT_CONFIGURATION_FILES"
value=
"true"
/>
...
...
@@ -229,7 +238,7 @@
<property
name=
"project.structure.proportion"
value=
"0.15"
/>
<property
name=
"project.structure.side.proportion"
value=
"0.2"
/>
<property
name=
"run.code.analysis.last.selected.profile"
value=
"pProject Default"
/>
<property
name=
"settings.editor.selected.configurable"
value=
"
configurable.group.appearance
"
/>
<property
name=
"settings.editor.selected.configurable"
value=
"
project.scopes
"
/>
</component>
<component
name=
"RecentsManager"
>
<key
name=
"CopyFile.RECENT_KEYS"
>
...
...
@@ -253,7 +262,7 @@
</list>
</option>
</component>
<component
name=
"RunManager"
selected=
"应用程序.
Priority
Test"
>
<component
name=
"RunManager"
selected=
"应用程序.
Synchronized
Test"
>
<configuration
name=
"InterruptedSwing"
type=
"Application"
factoryName=
"应用程序"
temporary=
"true"
nameIsGenerated=
"true"
>
<option
name=
"MAIN_CLASS_NAME"
value=
"多线程.InterruptedSwing"
/>
<module
name=
"IDEA_JAVA"
/>
...
...
@@ -293,8 +302,8 @@
<option
name=
"Make"
enabled=
"true"
/>
</method>
</configuration>
<configuration
name=
"S
leepMetho
dTest"
type=
"Application"
factoryName=
"应用程序"
temporary=
"true"
nameIsGenerated=
"true"
>
<option
name=
"MAIN_CLASS_NAME"
value=
"多线程.S
leepMetho
dTest"
/>
<configuration
name=
"S
ynchronize
dTest"
type=
"Application"
factoryName=
"应用程序"
temporary=
"true"
nameIsGenerated=
"true"
>
<option
name=
"MAIN_CLASS_NAME"
value=
"多线程.S
ynchronize
dTest"
/>
<module
name=
"IDEA_JAVA"
/>
<extension
name=
"coverage"
>
<pattern>
...
...
@@ -306,8 +315,8 @@
<option
name=
"Make"
enabled=
"true"
/>
</method>
</configuration>
<configuration
name=
"
SwingAndThread
"
type=
"Application"
factoryName=
"应用程序"
temporary=
"true"
nameIsGenerated=
"true"
>
<option
name=
"MAIN_CLASS_NAME"
value=
"多线程.
SwingAndThread
"
/>
<configuration
name=
"
ThreadSafeTest
"
type=
"Application"
factoryName=
"应用程序"
temporary=
"true"
nameIsGenerated=
"true"
>
<option
name=
"MAIN_CLASS_NAME"
value=
"多线程.
ThreadSafeTest
"
/>
<module
name=
"IDEA_JAVA"
/>
<extension
name=
"coverage"
>
<pattern>
...
...
@@ -321,11 +330,11 @@
</configuration>
<recent_temporary>
<list>
<item
itemvalue=
"应用程序.SynchronizedTest"
/>
<item
itemvalue=
"应用程序.ThreadSafeTest"
/>
<item
itemvalue=
"应用程序.PriorityTest"
/>
<item
itemvalue=
"应用程序.InterruptedSwing"
/>
<item
itemvalue=
"应用程序.JoinTest"
/>
<item
itemvalue=
"应用程序.SleepMethodTest"
/>
<item
itemvalue=
"应用程序.SwingAndThread"
/>
</list>
</recent_temporary>
</component>
...
...
@@ -406,21 +415,8 @@
<workItem
from=
"1563351572097"
duration=
"4795000"
/>
<workItem
from=
"1563364743765"
duration=
"95000"
/>
<workItem
from=
"1563364867577"
duration=
"289000"
/>
<workItem
from=
"1563365858290"
duration=
"1930000"
/>
</task>
<task
id=
"LOCAL-00006"
summary=
"Update"
>
<created>
1560003182152
</created>
<option
name=
"number"
value=
"00006"
/>
<option
name=
"presentableId"
value=
"LOCAL-00006"
/>
<option
name=
"project"
value=
"LOCAL"
/>
<updated>
1560003182152
</updated>
</task>
<task
id=
"LOCAL-00007"
summary=
"Update"
>
<created>
1560263227095
</created>
<option
name=
"number"
value=
"00007"
/>
<option
name=
"presentableId"
value=
"LOCAL-00007"
/>
<option
name=
"project"
value=
"LOCAL"
/>
<updated>
1560263227095
</updated>
<workItem
from=
"1563365858290"
duration=
"1971000"
/>
<workItem
from=
"1563411760601"
duration=
"4888000"
/>
</task>
<task
id=
"LOCAL-00008"
summary=
"Update"
>
<created>
1560351066854
</created>
...
...
@@ -751,11 +747,25 @@
<option
name=
"project"
value=
"LOCAL"
/>
<updated>
1563354040673
</updated>
</task>
<option
name=
"localTasksCounter"
value=
"55"
/>
<task
id=
"LOCAL-00055"
summary=
"Update"
>
<created>
1563367806675
</created>
<option
name=
"number"
value=
"00055"
/>
<option
name=
"presentableId"
value=
"LOCAL-00055"
/>
<option
name=
"project"
value=
"LOCAL"
/>
<updated>
1563367806677
</updated>
</task>
<task
id=
"LOCAL-00056"
summary=
"Update"
>
<created>
1563415917057
</created>
<option
name=
"number"
value=
"00056"
/>
<option
name=
"presentableId"
value=
"LOCAL-00056"
/>
<option
name=
"project"
value=
"LOCAL"
/>
<updated>
1563415917065
</updated>
</task>
<option
name=
"localTasksCounter"
value=
"57"
/>
<servers
/>
</component>
<component
name=
"TimeTrackingManager"
>
<option
name=
"totallyTimeSpent"
value=
"2
07436
000"
/>
<option
name=
"totallyTimeSpent"
value=
"2
12365
000"
/>
</component>
<component
name=
"TodoView"
selected-index=
"3"
>
<todo-panel
id=
"selected-file"
>
...
...
@@ -778,6 +788,7 @@
<window_info
id=
"Capture Tool"
order=
"5"
/>
<window_info
id=
"Favorites"
order=
"6"
side_tool=
"true"
weight=
"0.3295302"
/>
<window_info
id=
"设计师"
order=
"7"
/>
<window_info
anchor=
"bottom"
auto_hide=
"true"
id=
"Duplicates"
weight=
"0.32972974"
/>
<window_info
anchor=
"bottom"
auto_hide=
"true"
id=
"Run"
order=
"0"
weight=
"0.3716216"
/>
<window_info
anchor=
"bottom"
auto_hide=
"true"
id=
"Version Control"
order=
"1"
weight=
"0.3189189"
/>
<window_info
anchor=
"bottom"
auto_hide=
"true"
id=
"Inspection Results"
order=
"2"
weight=
"0.32916668"
/>
...
...
@@ -863,20 +874,6 @@
<option
name=
"FILTER_TARGETS"
value=
"false"
/>
</component>
<component
name=
"editorHistoryManager"
>
<entry
file=
"file://$PROJECT_DIR$/src/Swing程序设计/按钮1.jpg"
>
<provider
selected=
"true"
editor-type-id=
"images"
/>
</entry>
<entry
file=
"file://$PROJECT_DIR$/src/Swing程序设计/JTextAreaTest.java"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"700"
>
<caret
line=
"29"
column=
"44"
selection-start-line=
"29"
selection-start-column=
"44"
selection-end-line=
"29"
selection-end-column=
"44"
/>
<folding>
<element
signature=
"imports"
expanded=
"true"
/>
<element
signature=
"e#793#794#0"
expanded=
"true"
/>
</folding>
</state>
</provider>
</entry>
<entry
file=
"file://$PROJECT_DIR$/src/Swing程序设计/JButtonTest.java"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"1125"
>
...
...
@@ -1290,27 +1287,30 @@
</entry>
<entry
file=
"file://$PROJECT_DIR$/src/多线程/Priority.java"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"304"
>
<caret
line=
"29"
column=
"1"
lean-forward=
"true"
selection-start-line=
"15"
selection-end-line=
"29"
selection-end-column=
"1"
/>
<folding>
<element
signature=
"e#539#540#0"
expanded=
"true"
/>
<element
signature=
"e#588#589#0"
expanded=
"true"
/>
</folding>
<state
relative-caret-position=
"675"
>
<caret
line=
"29"
column=
"1"
selection-start-line=
"15"
selection-end-line=
"29"
selection-end-column=
"1"
/>
</state>
</provider>
</entry>
<entry
file=
"file://$PROJECT_DIR$/src/多线程/PriorityTest.java"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"600"
>
<caret
line=
"24"
column=
"1"
lean-forward=
"true"
selection-start-line=
"2"
selection-end-line=
"24"
selection-end-column=
"1"
/>
<caret
line=
"24"
column=
"1"
selection-start-line=
"2"
selection-end-line=
"24"
selection-end-column=
"1"
/>
</state>
</provider>
</entry>
<entry
file=
"file://$PROJECT_DIR$/src/多线程/ThreadSafeTest.java"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"550"
>
<caret
line=
"40"
column=
"19"
lean-forward=
"true"
selection-start-line=
"40"
selection-start-column=
"19"
selection-end-line=
"40"
selection-end-column=
"19"
/>
</state>
</provider>
</entry>
<entry
file=
"file://$PROJECT_DIR$/笔记/多线程.md"
>
<provider
selected=
"true"
editor-type-id=
"split-provider[text-editor;MarkdownPreviewEditor]"
>
<state
split_layout=
"SPLIT"
>
<first_editor
relative-caret-position=
"
490
"
>
<caret
line=
"
460"
column=
"7"
lean-forward=
"true"
selection-start-line=
"460"
selection-start-column=
"7"
selection-end-line=
"460"
selection-end-column=
"
7"
/>
<first_editor
relative-caret-position=
"
515
"
>
<caret
line=
"
567"
selection-start-line=
"567"
selection-end-line=
"56
7"
/>
<folding>
<element
signature=
"e#1766#1767#0"
expanded=
"true"
/>
<element
signature=
"e#1806#1807#0"
expanded=
"true"
/>
...
...
@@ -1330,6 +1330,13 @@
</state>
</provider>
</entry>
<entry
file=
"file://$PROJECT_DIR$/src/多线程/SynchronizedTest.java"
>
<provider
selected=
"true"
editor-type-id=
"text-editor"
>
<state
relative-caret-position=
"304"
>
<caret
line=
"36"
column=
"44"
lean-forward=
"true"
selection-start-line=
"36"
selection-start-column=
"44"
selection-end-line=
"36"
selection-end-column=
"44"
/>
</state>
</provider>
</entry>
</component>
<component
name=
"masterDetails"
>
<states>
...
...
@@ -1416,6 +1423,17 @@
</splitter-proportions>
</settings>
</state>
<state
key=
"ScopeChooserConfigurable.UI"
>
<settings>
<splitter-proportions>
<option
name=
"proportions"
>
<list>
<option
value=
"0.2"
/>
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>
\ No newline at end of file
src/多线程/SynchronizedTest.java
0 → 100644
浏览文件 @
268080e9
package
多线程;
//
!/
usr
/
bin
/
env
jdk1
.
8
// encoding:utf-8
//@software:IntelliJ IDEA
//@pack:多线程
//@user:彭友聪
//@date:2019/07/18
//@time:上午 10:13
//@project:IDEA_JAVA
//@file:SynchronizedTest.java
//Author:御承扬
//email:2923616405@qq.com
public
class
SynchronizedTest
implements
Runnable
{
private
int
num
=
10
;
public
void
run
()
{
while
(
true
)
{
synchronized
(
this
)
{
if
(
num
>
0
)
{
try
{
Thread
.
sleep
(
100
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
System
.
out
.
printf
(
"%s票数%d\n"
,
Thread
.
currentThread
().
getName
(),
num
);
num
--;
}
else
break
;
}
}
}
public
static
void
main
(
String
[]
args
)
{
SynchronizedTest
t
=
new
SynchronizedTest
();
Thread
tA
=
new
Thread
(
t
,
"线程一"
);
Thread
tB
=
new
Thread
(
t
,
"线程二"
);
Thread
tC
=
new
Thread
(
t
,
"线程三"
);
Thread
tD
=
new
Thread
(
t
,
"线程四"
);
// 启动线程
tA
.
start
();
tB
.
start
();
tC
.
start
();
tD
.
start
();
}
}
src/多线程/ThreadSafeTest.java
浏览文件 @
268080e9
...
...
@@ -32,14 +32,14 @@ public class ThreadSafeTest implements Runnable {
public
static
void
main
(
String
[]
args
)
{
ThreadSafeTest
t
=
new
ThreadSafeTest
();
Thread
t
A
=
new
Thread
(
t
,
"线程一"
);
Thread
t
B
=
new
Thread
(
t
,
"线程二"
);
Thread
t
C
=
new
Thread
(
t
,
"线程三"
);
Thread
t
D
=
new
Thread
(
t
,
"线程四"
);
Thread
t
1
=
new
Thread
(
t
,
"线程一"
);
Thread
t
2
=
new
Thread
(
t
,
"线程二"
);
Thread
t
3
=
new
Thread
(
t
,
"线程三"
);
Thread
t
4
=
new
Thread
(
t
,
"线程四"
);
// 启动线程
t
A
.
start
();
t
B
.
start
();
t
C
.
start
();
t
D
.
start
();
t
1
.
start
();
t
2
.
start
();
t
3
.
start
();
t
4
.
start
();
}
}
笔记/多线程.md
浏览文件 @
268080e9
...
...
@@ -458,4 +458,110 @@
}
}
}
```
\ No newline at end of file
```
## 六、线程的同步
*
线程的同步机制,是为了在多线程时,避免出现资源访问的冲突。
### 1、线程安全
*
线程安全问题主要考虑线程同时存取同一对象的数据。
*
实例:
```
public class ThreadSafeTest implements Runnable {
private int num = 10; // 设置当前票总数
public final void run() {
while (true) {
if (num > 0) {
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
System.out.printf( "%s票数%d\n", Thread.currentThread().getName(), num );
num--;
}
}
}
public static void main(String[] args) {
ThreadSafeTest t = new ThreadSafeTest();
Thread tA = new Thread( t,"线程一" );
Thread tB = new Thread( t,"线程二" );
Thread tC = new Thread( t,"线程三" );
Thread tD = new Thread( t,"线程四" );
// 启动线程
tA.start();
tB.start();
tC.start();
tD.start();
}
}
// 输出结果:
线程二票数10
线程三票数10
线程四票数10
线程一票数10
线程二票数6
线程三票数5
线程四票数5
线程一票数3
线程二票数2
线程三票数1
线程一票数1
线程四票数1
线程二票数-2
```
### 2、线程同步机制
*
基本上所有解决多线程资源冲突问题的方法都是采用给定时间只允许一个线程访问共享资源,即给共享资源上一道锁。
*
**锁的主要作用是为了防止不同线程在同一时间访问同一代码块,如果在同一时间访问同一代码块,有可能出现死“死锁”——两个线程运行时都在等待对方的锁,从而造成程序的停滞。**
#### 2.1、同步块
*
同步机制使用 synchronized 关键字,使用该关键字包含的代码块称为同步块,也称为临界区,语法如下:
```
synchronzied(Object){
}
// 例子:
public class SynchronizedTest implements Runnable {
private int num = 10;
public void run() {
while (true) {
synchronized (this) {
if (num > 0) {
try {
Thread.sleep( 100 );
} catch (Exception e) {
e.printStackTrace();
}
System.out.printf( "%s票数%d\n", Thread.currentThread().getName(), num );
num--;
}
else
break;
}
}
}
public static void main(String[] args) {
SynchronizedTest t = new SynchronizedTest();
Thread tA = new Thread( t,"线程一" );
Thread tB = new Thread( t,"线程二" );
Thread tC = new Thread( t,"线程三" );
Thread tD = new Thread( t,"线程四" );
// 启动线程
tA.start();
tB.start();
tC.start();
tD.start();
}
}
输出:
线程一票数10
线程一票数9
线程三票数8
线程四票数7
线程四票数6
线程二票数5
线程二票数4
线程四票数3
线程三票数2
线程一票数1
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录